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 2018/10/12 14:52:56 UTC

[01/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 9ab80c17b -> d13418593


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html
new file mode 100644
index 0000000..a34c209
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html
@@ -0,0 +1,412 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestForceUpdateProcedure.WaitingProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestForceUpdateProcedure.WaitingProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.WaitingProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.WaitingProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.procedure2.store.wal</div>
+<h2 title="Class TestForceUpdateProcedure.WaitingProcedure" class="title">Class TestForceUpdateProcedure.WaitingProcedure</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.store.wal.TestForceUpdateProcedure.WaitingProcedure</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><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;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public static final class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#line.90">TestForceUpdateProcedure.WaitingProcedure</a>
+extends org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>org.apache.hadoop.hbase.procedure2.Procedure.LockState</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>NO_PROC_ID, NO_TIMEOUT</code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#WaitingProcedure--">WaitingProcedure</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#abort-java.lang.Void-">abort</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#execute-java.lang.Void-">execute</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</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/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#rollback-java.lang.Void-">rollback</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<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/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>acquireLock, addStackIndex, afterReplay, beforeReplay, compareTo, completionCleanup, doExecute, doRollback, elapsedTime, getChildrenLatch, getException, getLastUpdate, getNonceKey, getOwner, getParentProcId, getProcedureMetrics, getProcId, getProcIdHashCode, getProcName, getResult, getRootProcedureId, getRootProcId, getStackIndexes, getState, getSubmittedTime, getTimeout, getTimeoutTimestamp, hasChildren, hasException, hasLock, hasOwner, hasParent, hasTimeout, haveSameParent, holdLock, incChildrenLatch, isBypass, isFailed, isFinished, isInitializing, isRunnable, isSuccess, isWaiting, isYieldAfterExecutionStep, releaseLock, removeStackIndex, setAbortFailure, setChildrenLatch, setFailure, setFailure, setLastUpdate, setNonceKey, setOwner, setOwner, setParentProcId, setProcId, setResult, setRootProcId, setStackIndexes, setState, setSubmittedTime, setTimeout, setTimeoutFailure, shouldWaitClientAck, skipPersistence, toString, toStringClass, toStringClassDetails, toStringDetails, toS
 tringSimpleSB, toStringState, updateMetricsOnFinish, updateMetricsOnSubmit, updateTimestamp, waitInitialized, wasExecuted</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="WaitingProcedure--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>WaitingProcedure</h4>
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.90">WaitingProcedure</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="execute-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>execute</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.93">execute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)
+                                                                throws org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                                                                       org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                                                                       <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="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>execute</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="rollback-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rollback</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.102">rollback</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>rollback</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="abort-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>abort</h4>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.107">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>abort</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+</dl>
+</li>
+</ul>
+<a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>serializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.112">serializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>serializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>deserializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#line.116">deserializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>deserializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.WaitingProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.WaitingProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>


[29/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span cla

<TRUNCATED>

[46/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/balancer/package-tree.html
----------------------------------------------------------------------
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 1799704..abd92a9 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" title="class or interface in java.io">Serializable</a>)
 <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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
index adac928..43c4b47 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/class-use/MasterServices.html
@@ -680,14 +680,10 @@
 <td class="colLast"><span class="typeNameLabel">MasterProcedureEnv.WALStoreLeaseRecovery.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#master">master</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
-<td class="colLast"><span class="typeNameLabel">MasterProcedureEnv.MasterProcedureStoreListener.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#master">master</a></span></code>&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><code>protected <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><span class="typeNameLabel">RSProcedureDispatcher.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html#master">master</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
 <td class="colLast"><span class="typeNameLabel">MasterProcedureUtil.NonceProcedureRunnable.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html#master">master</a></span></code>&nbsp;</td>
 </tr>
@@ -724,17 +720,14 @@
                   <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a>&nbsp;remoteDispatcher)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#MasterProcedureStoreListener-org.apache.hadoop.hbase.master.MasterServices-">MasterProcedureStoreListener</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html#NonceProcedureRunnable-org.apache.hadoop.hbase.master.MasterServices-long-long-">NonceProcedureRunnable</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
                       long&nbsp;nonceGroup,
                       long&nbsp;nonce)</code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html#RSProcedureDispatcher-org.apache.hadoop.hbase.master.MasterServices-">RSProcedureDispatcher</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#WALStoreLeaseRecovery-org.apache.hadoop.hbase.master.MasterServices-">WALStoreLeaseRecovery</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 4d5bf99..a26a606 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -347,10 +347,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<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/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/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/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/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
deleted file mode 100644
index b4275b6..0000000
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
+++ /dev/null
@@ -1,348 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!-- NewPage -->
-<html lang="en">
-<head>
-<!-- Generated by javadoc -->
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>MasterProcedureEnv.MasterProcedureStoreListener (Apache HBase 3.0.0-SNAPSHOT API)</title>
-<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
-<script type="text/javascript" src="../../../../../../script.js"></script>
-</head>
-<body>
-<script type="text/javascript"><!--
-    try {
-        if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="MasterProcedureEnv.MasterProcedureStoreListener (Apache HBase 3.0.0-SNAPSHOT API)";
-        }
-    }
-    catch(err) {
-    }
-//-->
-var methods = {"i0":10,"i1":10};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
-var altColor = "altColor";
-var rowColor = "rowColor";
-var tableTab = "tableTab";
-var activeTableTab = "activeTableTab";
-</script>
-<noscript>
-<div>JavaScript is disabled on your browser.</div>
-</noscript>
-<!-- ========= START OF TOP NAVBAR ======= -->
-<div class="topNav"><a name="navbar.top">
-<!--   -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.top.firstrow">
-<!--   -->
-</a>
-<ul class="navList" title="Navigation">
-<li><a href="../../../../../../overview-summary.html">Overview</a></li>
-<li><a href="package-summary.html">Package</a></li>
-<li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/MasterProcedureEnv.MasterProcedureStoreListener.html">Use</a></li>
-<li><a href="package-tree.html">Tree</a></li>
-<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
-<li><a href="../../../../../../index-all.html">Index</a></li>
-<li><a href="../../../../../../help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
-</ul>
-<ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">Frames</a></li>
-<li><a href="MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_top">
-<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
-  allClassesLink = document.getElementById("allclasses_navbar_top");
-  if(window==top) {
-    allClassesLink.style.display = "block";
-  }
-  else {
-    allClassesLink.style.display = "none";
-  }
-  //-->
-</script>
-</div>
-<div>
-<ul class="subNavList">
-<li>Summary:&nbsp;</li>
-<li>Nested&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><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>
-</div>
-<a name="skip.navbar.top">
-<!--   -->
-</a></div>
-<!-- ========= END OF TOP NAVBAR ========= -->
-<!-- ======== START OF CLASS DATA ======== -->
-<div class="header">
-<div class="subTitle">org.apache.hadoop.hbase.master.procedure</div>
-<h2 title="Class MasterProcedureEnv.MasterProcedureStoreListener" class="title">Class MasterProcedureEnv.MasterProcedureStoreListener</h2>
-</div>
-<div class="contentContainer">
-<ul class="inheritance">
-<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
-<li>
-<ul class="inheritance">
-<li>org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener</li>
-</ul>
-</li>
-</ul>
-<div class="description">
-<ul class="blockList">
-<li class="blockList">
-<dl>
-<dt>All Implemented Interfaces:</dt>
-<dd><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></dd>
-</dl>
-<dl>
-<dt>Enclosing class:</dt>
-<dd><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a></dd>
-</dl>
-<hr>
-<br>
-<pre>@InterfaceAudience.Private
-public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.77">MasterProcedureEnv.MasterProcedureStoreListener</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/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></pre>
-</li>
-</ul>
-</div>
-<div class="summary">
-<ul class="blockList">
-<li class="blockList">
-<!-- =========== 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>private <a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#master">master</a></span></code>&nbsp;</td>
-</tr>
-</table>
-</li>
-</ul>
-<!-- ======== CONSTRUCTOR SUMMARY ======== -->
-<ul class="blockList">
-<li class="blockList"><a name="constructor.summary">
-<!--   -->
-</a>
-<h3>Constructor Summary</h3>
-<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
-<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colOne" scope="col">Constructor and Description</th>
-</tr>
-<tr class="altColor">
-<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#MasterProcedureStoreListener-org.apache.hadoop.hbase.master.MasterServices-">MasterProcedureStoreListener</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</code>&nbsp;</td>
-</tr>
-</table>
-</li>
-</ul>
-<!-- ========== METHOD SUMMARY =========== -->
-<ul class="blockList">
-<li class="blockList"><a name="method.summary">
-<!--   -->
-</a>
-<h3>Method Summary</h3>
-<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Method and Description</th>
-</tr>
-<tr id="i0" class="altColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#abortProcess--">abortProcess</a></span>()</code>
-<div class="block">triggered when the store is not able to write out data.</div>
-</td>
-</tr>
-<tr id="i1" class="rowColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#postSync--">postSync</a></span>()</code>
-<div class="block">triggered when the store sync is completed.</div>
-</td>
-</tr>
-</table>
-<ul class="blockList">
-<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
-<!--   -->
-</a>
-<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
-<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-<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="master">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>master</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#line.79">master</a></pre>
-</li>
-</ul>
-</li>
-</ul>
-<!-- ========= CONSTRUCTOR DETAIL ======== -->
-<ul class="blockList">
-<li class="blockList"><a name="constructor.detail">
-<!--   -->
-</a>
-<h3>Constructor Detail</h3>
-<a name="MasterProcedureStoreListener-org.apache.hadoop.hbase.master.MasterServices-">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>MasterProcedureStoreListener</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#line.81">MasterProcedureStoreListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
-</li>
-</ul>
-</li>
-</ul>
-<!-- ============ METHOD DETAIL ========== -->
-<ul class="blockList">
-<li class="blockList"><a name="method.detail">
-<!--   -->
-</a>
-<h3>Method Detail</h3>
-<a name="postSync--">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>postSync</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#line.86">postSync</a>()</pre>
-<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#postSync--">ProcedureStore.ProcedureStoreListener</a></code></span></div>
-<div class="block">triggered when the store sync is completed.</div>
-<dl>
-<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#postSync--">postSync</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></code></dd>
-</dl>
-</li>
-</ul>
-<a name="abortProcess--">
-<!--   -->
-</a>
-<ul class="blockListLast">
-<li class="blockList">
-<h4>abortProcess</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#line.91">abortProcess</a>()</pre>
-<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#abortProcess--">ProcedureStore.ProcedureStoreListener</a></code></span></div>
-<div class="block">triggered when the store is not able to write out data.
- the main process should abort.</div>
-<dl>
-<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
-<dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#abortProcess--">abortProcess</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></code></dd>
-</dl>
-</li>
-</ul>
-</li>
-</ul>
-</li>
-</ul>
-</div>
-</div>
-<!-- ========= END OF CLASS DATA ========= -->
-<!-- ======= START OF BOTTOM NAVBAR ====== -->
-<div class="bottomNav"><a name="navbar.bottom">
-<!--   -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.bottom.firstrow">
-<!--   -->
-</a>
-<ul class="navList" title="Navigation">
-<li><a href="../../../../../../overview-summary.html">Overview</a></li>
-<li><a href="package-summary.html">Package</a></li>
-<li class="navBarCell1Rev">Class</li>
-<li><a href="class-use/MasterProcedureEnv.MasterProcedureStoreListener.html">Use</a></li>
-<li><a href="package-tree.html">Tree</a></li>
-<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
-<li><a href="../../../../../../index-all.html">Index</a></li>
-<li><a href="../../../../../../help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
-</ul>
-<ul class="navList">
-<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">Frames</a></li>
-<li><a href="MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_bottom">
-<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
-  allClassesLink = document.getElementById("allclasses_navbar_bottom");
-  if(window==top) {
-    allClassesLink.style.display = "block";
-  }
-  else {
-    allClassesLink.style.display = "none";
-  }
-  //-->
-</script>
-</div>
-<div>
-<ul class="subNavList">
-<li>Summary:&nbsp;</li>
-<li>Nested&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><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>
-</div>
-<a name="skip.navbar.bottom">
-<!--   -->
-</a></div>
-<!-- ======== END OF BOTTOM NAVBAR ======= -->
-<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
index 0a84606..27f4e67 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
@@ -49,7 +49,7 @@ var activeTableTab = "activeTableTab";
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.51">MasterProcedureEnv.WALStoreLeaseRecovery</a>
+public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.50">MasterProcedureEnv.WALStoreLeaseRecovery</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/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a></pre>
 </li>
@@ -212,7 +212,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/w
 <ul class="blockListLast">
 <li class="blockList">
 <h4>master</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.52">master</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.51">master</a></pre>
 </li>
 </ul>
 </li>
@@ -229,7 +229,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/w
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALStoreLeaseRecovery</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.54">WALStoreLeaseRecovery</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.53">WALStoreLeaseRecovery</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
 </li>
 </ul>
 </li>
@@ -246,7 +246,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/w
 <ul class="blockList">
 <li class="blockList">
 <h4>recoverFileLease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.59">recoverFileLease</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.58">recoverFileLease</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                              org.apache.hadoop.fs.Path&nbsp;path)
                       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>
@@ -263,7 +263,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/w
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.71">isRunning</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#line.70">isRunning</a>()</pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/w
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
index 399dae0..e2e6f42 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" target="_top">Frames</a></li>
@@ -115,7 +115,7 @@ var activeTableTab = "activeTableTab";
 <br>
 <pre>@InterfaceAudience.Private
  @InterfaceStability.Evolving
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.47">MasterProcedureEnv</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.46">MasterProcedureEnv</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/conf/ConfigurationObserver.html" title="interface in org.apache.hadoop.hbase.conf">ConfigurationObserver</a></pre>
 </li>
@@ -138,10 +138,6 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
-<td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.WALStoreLeaseRecovery</a></span></code>&nbsp;</td>
 </tr>
 </table>
@@ -299,7 +295,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <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/MasterProcedureEnv.html#line.48">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.47">LOG</a></pre>
 </li>
 </ul>
 <a name="remoteDispatcher">
@@ -308,7 +304,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteDispatcher</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.96">remoteDispatcher</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.75">remoteDispatcher</a></pre>
 </li>
 </ul>
 <a name="procSched">
@@ -317,7 +313,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>procSched</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.97">procSched</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.76">procSched</a></pre>
 </li>
 </ul>
 <a name="master">
@@ -326,7 +322,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>master</h4>
-<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.98">master</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.77">master</a></pre>
 </li>
 </ul>
 </li>
@@ -343,7 +339,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>MasterProcedureEnv</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.100">MasterProcedureEnv</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.79">MasterProcedureEnv</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
 </li>
 </ul>
 <a name="MasterProcedureEnv-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher-">
@@ -352,7 +348,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterProcedureEnv</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.104">MasterProcedureEnv</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.83">MasterProcedureEnv</a>(<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master,
                           <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a>&nbsp;remoteDispatcher)</pre>
 </li>
 </ul>
@@ -370,7 +366,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getRequestUser</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.111">getRequestUser</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.90">getRequestUser</a>()</pre>
 </li>
 </ul>
 <a name="getMasterServices--">
@@ -379,7 +375,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterServices</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.115">getMasterServices</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.94">getMasterServices</a>()</pre>
 </li>
 </ul>
 <a name="getMasterConfiguration--">
@@ -388,7 +384,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.119">getMasterConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.98">getMasterConfiguration</a>()</pre>
 </li>
 </ul>
 <a name="getAssignmentManager--">
@@ -397,7 +393,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.123">getAssignmentManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.102">getAssignmentManager</a>()</pre>
 </li>
 </ul>
 <a name="getMasterCoprocessorHost--">
@@ -406,7 +402,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.127">getMasterCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.106">getMasterCoprocessorHost</a>()</pre>
 </li>
 </ul>
 <a name="getProcedureScheduler--">
@@ -415,7 +411,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedureScheduler</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.131">getProcedureScheduler</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.110">getProcedureScheduler</a>()</pre>
 </li>
 </ul>
 <a name="getRemoteDispatcher--">
@@ -424,7 +420,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getRemoteDispatcher</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.135">getRemoteDispatcher</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.114">getRemoteDispatcher</a>()</pre>
 </li>
 </ul>
 <a name="getReplicationPeerManager--">
@@ -433,7 +429,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicationPeerManager</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.139">getReplicationPeerManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.118">getReplicationPeerManager</a>()</pre>
 </li>
 </ul>
 <a name="getMasterFileSystem--">
@@ -442,7 +438,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.143">getMasterFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.122">getMasterFileSystem</a>()</pre>
 </li>
 </ul>
 <a name="isRunning--">
@@ -451,7 +447,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.147">isRunning</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.126">isRunning</a>()</pre>
 </li>
 </ul>
 <a name="isInitialized--">
@@ -460,7 +456,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>isInitialized</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.152">isInitialized</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.131">isInitialized</a>()</pre>
 </li>
 </ul>
 <a name="waitInitialized-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -469,7 +465,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>waitInitialized</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.156">waitInitialized</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.135">waitInitialized</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>
 </li>
 </ul>
 <a name="setEventReady-org.apache.hadoop.hbase.procedure2.ProcedureEvent-boolean-">
@@ -478,7 +474,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockList">
 <li class="blockList">
 <h4>setEventReady</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.160">setEventReady</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;event,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.139">setEventReady</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt;&nbsp;event,
                           boolean&nbsp;isReady)</pre>
 </li>
 </ul>
@@ -488,7 +484,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.169">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#line.148">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">ConfigurationObserver</a></code></span></div>
 <div class="block">This method would be called by the <a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
@@ -527,7 +523,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/conf/Configuration
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html
deleted file mode 100644
index 8ca8d79..0000000
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<!-- NewPage -->
-<html lang="en">
-<head>
-<!-- Generated by javadoc -->
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>Uses of Class org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener (Apache HBase 3.0.0-SNAPSHOT API)</title>
-<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
-<script type="text/javascript" src="../../../../../../../script.js"></script>
-</head>
-<body>
-<script type="text/javascript"><!--
-    try {
-        if (location.href.indexOf('is-external=true') == -1) {
-            parent.document.title="Uses of Class org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener (Apache HBase 3.0.0-SNAPSHOT API)";
-        }
-    }
-    catch(err) {
-    }
-//-->
-</script>
-<noscript>
-<div>JavaScript is disabled on your browser.</div>
-</noscript>
-<!-- ========= START OF TOP NAVBAR ======= -->
-<div class="topNav"><a name="navbar.top">
-<!--   -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.top.firstrow">
-<!--   -->
-</a>
-<ul class="navList" title="Navigation">
-<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
-<li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
-<li class="navBarCell1Rev">Use</li>
-<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
-<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
-<li><a href="../../../../../../../index-all.html">Index</a></li>
-<li><a href="../../../../../../../help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li>Prev</li>
-<li>Next</li>
-</ul>
-<ul class="navList">
-<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">Frames</a></li>
-<li><a href="MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_top">
-<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
-  allClassesLink = document.getElementById("allclasses_navbar_top");
-  if(window==top) {
-    allClassesLink.style.display = "block";
-  }
-  else {
-    allClassesLink.style.display = "none";
-  }
-  //-->
-</script>
-</div>
-<a name="skip.navbar.top">
-<!--   -->
-</a></div>
-<!-- ========= END OF TOP NAVBAR ========= -->
-<div class="header">
-<h2 title="Uses of Class org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener" class="title">Uses of Class<br>org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener</h2>
-</div>
-<div class="classUseContainer">No usage of org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv.MasterProcedureStoreListener</div>
-<!-- ======= START OF BOTTOM NAVBAR ====== -->
-<div class="bottomNav"><a name="navbar.bottom">
-<!--   -->
-</a>
-<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
-<a name="navbar.bottom.firstrow">
-<!--   -->
-</a>
-<ul class="navList" title="Navigation">
-<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
-<li><a href="../package-summary.html">Package</a></li>
-<li><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">Class</a></li>
-<li class="navBarCell1Rev">Use</li>
-<li><a href="../../../../../../../overview-tree.html">Tree</a></li>
-<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
-<li><a href="../../../../../../../index-all.html">Index</a></li>
-<li><a href="../../../../../../../help-doc.html">Help</a></li>
-</ul>
-</div>
-<div class="subNav">
-<ul class="navList">
-<li>Prev</li>
-<li>Next</li>
-</ul>
-<ul class="navList">
-<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/master/procedure/class-use/MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">Frames</a></li>
-<li><a href="MasterProcedureEnv.MasterProcedureStoreListener.html" target="_top">No&nbsp;Frames</a></li>
-</ul>
-<ul class="navList" id="allclasses_navbar_bottom">
-<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
-</ul>
-<div>
-<script type="text/javascript"><!--
-  allClassesLink = document.getElementById("allclasses_navbar_bottom");
-  if(window==top) {
-    allClassesLink.style.display = "block";
-  }
-  else {
-    allClassesLink.style.display = "none";
-  }
-  //-->
-</script>
-</div>
-<a name="skip.navbar.bottom">
-<!--   -->
-</a></div>
-<!-- ======== END OF BOTTOM NAVBAR ======= -->
-<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
index b04b6b6..5b93787 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-frame.html
@@ -38,7 +38,6 @@
 <li><a href="MasterDDLOperationHelper.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterDDLOperationHelper</a></li>
 <li><a href="MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureConstants</a></li>
 <li><a href="MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv</a></li>
-<li><a href="MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv.MasterProcedureStoreListener</a></li>
 <li><a href="MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv.WALStoreLeaseRecovery</a></li>
 <li><a href="MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureScheduler</a></li>
 <li><a href="MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureUtil</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
index d598235..95ee3a3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-summary.html
@@ -202,143 +202,139 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></td>
-<td class="colLast">&nbsp;</td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.WALStoreLeaseRecovery</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></td>
 <td class="colLast">
 <div class="block">ProcedureScheduler for the Master Procedures.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureUtil</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureUtil.NonceProcedureRunnable</a></td>
 <td class="colLast">
 <div class="block">Helper Runnable used in conjunction with submitProcedure() to deal with
  submitting procs with nonce.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">MetaQueue</a></td>
 <td class="colLast">Deprecated
 <div class="block"><span class="deprecationComment">only used for <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure"><code>RecoverMetaProcedure</code></a>.</span></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyNamespaceProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ModifyNamespaceProcedure</a></td>
 <td class="colLast">
 <div class="block">The procedure to add a namespace to an existing table.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ModifyTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ModifyTableProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">PeerQueue</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureDescriber.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedureDescriber</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch</a></td>
 <td class="colLast">
 <div class="block">Latch used by the Master to have the prepare() sync behaviour for old
  clients, that can only get exceptions in a synchronous way.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.CompatibilityLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch.CompatibilityLatch</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedurePrepareLatch.NoopLatch.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedurePrepareLatch.NoopLatch</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedureSyncWait</a></td>
 <td class="colLast">
 <div class="block">Helper to synchronously wait on conditions.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ProcedureSyncWait.ProcedureFuture.html" title="class in org.apache.hadoop.hbase.master.procedure">ProcedureSyncWait.ProcedureFuture</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/Queue.html" title="class in org.apache.hadoop.hbase.master.procedure">Queue</a>&lt;TKey extends <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;TKey&gt;&gt;</td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RecoverMetaProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">RecoverMetaProcedure</a></td>
 <td class="colLast">Deprecated
 <div class="block"><span class="deprecationComment">Do not use any more, leave it here only for compatible.</span></div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ReopenTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ReopenTableRegionsProcedure</a></td>
 <td class="colLast">
 <div class="block">Used for reopening the regions for a table.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RestoreSnapshotProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">RestoreSnapshotProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher</a></td>
 <td class="colLast">
 <div class="block">A remote procecdure dispatcher for regionservers.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionCloseOperation.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher.RegionCloseOperation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionOpenOperation.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher.RegionOpenOperation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.RegionOperation.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher.RegionOperation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/RSProcedureDispatcher.ServerOperation.html" title="class in org.apache.hadoop.hbase.master.procedure">RSProcedureDispatcher.ServerOperation</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/SchemaLocking.html" title="class in org.apache.hadoop.hbase.master.procedure">SchemaLocking</a></td>
 <td class="colLast">
 <div class="block">
  Locks on namespaces, tables, and regions.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerCrashProcedure</a></td>
 <td class="colLast">
 <div class="block">Handle crashed server.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">ServerQueue</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableQueue.html" title="class in org.apache.hadoop.hbase.master.procedure">TableQueue</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TruncateTableProcedure.html" title="class in org.apache.hadoop.hbase.master.procedure">TruncateTableProcedure</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
----------------------------------------------------------------------
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 a3eaab0..f76d995 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -106,7 +106,6 @@
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterDDLOperationHelper.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterDDLOperationHelper</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureConstants</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv</span></a> (implements org.apache.hadoop.hbase.conf.<a href="../../../../../../org/apache/hadoop/hbase/conf/ConfigurationObserver.html" title="interface in org.apache.hadoop.hbase.conf">ConfigurationObserver</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.MasterProcedureStoreListener</span></a> (implements org.apache.hadoop.hbase.procedure2.store.<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.WALStoreLeaseRecovery</span></a> (implements org.apache.hadoop.hbase.procedure2.store.wal.<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureUtil</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureUtil.NonceProcedureRunnable</span></a></li>
@@ -216,10 +215,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" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/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/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>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 0e85ea0..101e439 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -437,19 +437,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
 </ul>
 </li>
 </ul>


[18/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
index bd1b3f6..0c69df9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
@@ -31,430 +31,441 @@
 <span class="sourceLineNo">023</span>import java.util.Iterator;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.util.Map;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.TreeMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">026</span>import java.util.stream.LongStream;<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.apache.yetus.audience.InterfaceStability;<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> * Keeps track of live procedures.<a name="line.32"></a>
-<span class="sourceLineNo">033</span> *<a name="line.33"></a>
-<span class="sourceLineNo">034</span> * It can be used by the ProcedureStore to identify which procedures are already<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * deleted/completed to avoid the deserialization step on restart<a name="line.35"></a>
-<span class="sourceLineNo">036</span> */<a name="line.36"></a>
-<span class="sourceLineNo">037</span>@InterfaceAudience.Private<a name="line.37"></a>
-<span class="sourceLineNo">038</span>@InterfaceStability.Evolving<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class ProcedureStoreTracker {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  // Key is procedure id corresponding to first bit of the bitmap.<a name="line.40"></a>
-<span class="sourceLineNo">041</span>  private final TreeMap&lt;Long, BitSetNode&gt; map = new TreeMap&lt;&gt;();<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>   * If true, do not remove bits corresponding to deleted procedures. Note that this can result<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * in huge bitmaps overtime.<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   * Currently, it's set to true only when building tracker state from logs during recovery. During<a name="line.46"></a>
-<span class="sourceLineNo">047</span>   * recovery, if we are sure that a procedure has been deleted, reading its old update entries<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * can be skipped.<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private boolean keepDeletes = false;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   * If true, it means tracker has incomplete information about the active/deleted procedures.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   * It's set to true only when recovering from old logs. See {@link #isDeleted(long)} docs to<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   * understand it's real use.<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  boolean partial = false;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private long minModifiedProcId = Long.MAX_VALUE;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private long maxModifiedProcId = Long.MIN_VALUE;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public enum DeleteState { YES, NO, MAYBE }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    reset();<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      final BitSetNode node = new BitSetNode(protoNode);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      map.put(node.getStart(), node);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<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>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Resets internal state to same as given {@code tracker}. Does deep copy of the bitmap.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public void resetTo(ProcedureStoreTracker tracker) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    resetTo(tracker, false);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Resets internal state to same as given {@code tracker}, and change the deleted flag according<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * to the modified flag if {@code resetDelete} is true. Does deep copy of the bitmap.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * &lt;p/&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * The {@code resetDelete} will be set to true when building cleanup tracker, please see the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * comments in {@link BitSetNode#BitSetNode(BitSetNode, boolean)} to learn how we change the<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * deleted flag if {@code resetDelete} is true.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   */<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public void resetTo(ProcedureStoreTracker tracker, boolean resetDelete) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    reset();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    this.partial = tracker.partial;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    this.minModifiedProcId = tracker.minModifiedProcId;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.maxModifiedProcId = tracker.maxModifiedProcId;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this.keepDeletes = tracker.keepDeletes;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : tracker.map.entrySet()) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      map.put(entry.getKey(), new BitSetNode(entry.getValue(), resetDelete));<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>  public void insert(long procId) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    insert(null, procId);<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>  public void insert(long[] procIds) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      insert(procIds[i]);<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><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public void insert(long procId, long[] subProcIds) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    BitSetNode node = update(null, procId);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    for (int i = 0; i &lt; subProcIds.length; ++i) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      node = insert(node, subProcIds[i]);<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><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private BitSetNode insert(BitSetNode node, long procId) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (node == null || !node.contains(procId)) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      node = getOrCreateNode(procId);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    node.insertOrUpdate(procId);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    trackProcIds(procId);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return node;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public void update(long procId) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    update(null, procId);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private BitSetNode update(BitSetNode node, long procId) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    node = lookupClosestNode(node, procId);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    assert node != null : "expected node to update procId=" + procId;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    node.insertOrUpdate(procId);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    trackProcIds(procId);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    return node;<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>  public void delete(long procId) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    delete(null, procId);<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>  public void delete(final long[] procIds) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    Arrays.sort(procIds);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    BitSetNode node = null;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      node = delete(node, procIds[i]);<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>  private BitSetNode delete(BitSetNode node, long procId) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    node = lookupClosestNode(node, procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assert node != null : "expected node to delete procId=" + procId;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    node.delete(procId);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    if (!keepDeletes &amp;&amp; node.isEmpty()) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      // TODO: RESET if (map.size() == 1)<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      map.remove(node.getStart());<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>    trackProcIds(procId);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return node;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Will be called when restarting where we need to rebuild the ProcedureStoreTracker.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   */<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  public void setMinMaxModifiedProcIds(long min, long max) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    this.minModifiedProcId = min;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    this.maxModifiedProcId = max;<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>   * This method is used when restarting where we need to rebuild the ProcedureStoreTracker. The<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * {@link #delete(long)} method above assume that the {@link BitSetNode} exists, but when restart<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * this is not true, as we will read the wal files in reverse order so a delete may come first.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  public void setDeleted(long procId, boolean isDeleted) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    BitSetNode node = getOrCreateNode(procId);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node=" + node;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    node.updateState(procId, isDeleted);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    trackProcIds(procId);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * Set the given bit for the procId to delete if it was modified before.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * &lt;p/&gt;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * This method is used to test whether a procedure wal file can be safely deleted, as if all the<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * procedures in the given procedure wal file has been modified in the new procedure wal files,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * then we can delete it.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  public void setDeletedIfModified(long... procId) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    BitSetNode node = null;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    for (int i = 0; i &lt; procId.length; ++i) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      node = lookupClosestNode(node, procId[i]);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (node != null &amp;&amp; node.isModified(procId[i])) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        node.delete(procId[i]);<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>
-<span class="sourceLineNo">198</span>  /**<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * Similar with {@link #setDeletedIfModified(long...)}, but here the {@code procId} are given by<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the {@code tracker}. If a procedure is modified by us, and also by the given {@code tracker},<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * then we mark it as deleted.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @see #setDeletedIfModified(long...)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  public void setDeletedIfModifiedInBoth(ProcedureStoreTracker tracker) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    BitSetNode trackerNode = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    for (BitSetNode node : map.values()) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final long minProcId = node.getStart();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final long maxProcId = node.getEnd();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      for (long procId = minProcId; procId &lt;= maxProcId; ++procId) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (!node.isModified(procId)) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          continue;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>        trackerNode = tracker.lookupClosestNode(trackerNode, procId);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (trackerNode == null || !trackerNode.contains(procId) ||<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          trackerNode.isModified(procId)) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          // the procedure was removed or modified<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          node.delete(procId);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * lookup the node containing the specified procId.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * @param node cached node to check before doing a lookup<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @param procId the procId to lookup<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @return the node that may contains the procId or null<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private BitSetNode lookupClosestNode(final BitSetNode node, final long procId) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    if (node != null &amp;&amp; node.contains(procId)) return node;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return entry != null ? entry.getValue() : null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  private void trackProcIds(long procId) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    minModifiedProcId = Math.min(minModifiedProcId, procId);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    maxModifiedProcId = Math.max(maxModifiedProcId, procId);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public long getModifiedMinProcId() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return minModifiedProcId;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public long getModifiedMaxProcId() {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return maxModifiedProcId;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  public void reset() {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    this.keepDeletes = false;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    this.partial = false;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    this.map.clear();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    resetModified();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public boolean isModified(long procId) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    return entry != null &amp;&amp; entry.getValue().contains(procId) &amp;&amp;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      entry.getValue().isModified(procId);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * If {@link #partial} is false, returns state from the bitmap. If no state is found for<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   * {@code procId}, returns YES.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   * If partial is true, tracker doesn't have complete view of system state, so it returns MAYBE<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * if there is no update for the procedure or if it doesn't have a state in bitmap. Otherwise,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * returns state from the bitmap.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public DeleteState isDeleted(long procId) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (entry != null &amp;&amp; entry.getValue().contains(procId)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      BitSetNode node = entry.getValue();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      DeleteState state = node.isDeleted(procId);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      return partial &amp;&amp; !node.isModified(procId) ? DeleteState.MAYBE : state;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return partial ? DeleteState.MAYBE : DeleteState.YES;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getActiveMinProcId() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // TODO: Cache?<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.firstEntry();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    return entry == null ? 0 : entry.getValue().getActiveMinProcId();<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>  public void setKeepDeletes(boolean keepDeletes) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    this.keepDeletes = keepDeletes;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // If not to keep deletes, remove the BitSetNodes which are empty (i.e. contains ids of deleted<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // procedures).<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    if (!keepDeletes) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      Iterator&lt;Map.Entry&lt;Long, BitSetNode&gt;&gt; it = map.entrySet().iterator();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      while (it.hasNext()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        Map.Entry&lt;Long, BitSetNode&gt; entry = it.next();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        if (entry.getValue().isEmpty()) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          it.remove();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  public boolean isPartial() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return partial;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public void setPartialFlag(boolean isPartial) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (this.partial &amp;&amp; !isPartial) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        entry.getValue().unsetPartialFlag();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.partial = isPartial;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return true, if no procedure is active, else false.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  public boolean isEmpty() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      if (!entry.getValue().isEmpty()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        return false;<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>    return true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * @return true if all procedure was modified or deleted since last call to<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   *         {@link #resetModified()}.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   */<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  public boolean isAllModified() {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (!entry.getValue().isAllModified()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        return false;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    return true;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  /**<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * Clears the list of updated procedure ids. This doesn't affect global list of active<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   * procedure ids.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  public void resetModified() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      entry.getValue().resetModified();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    minModifiedProcId = Long.MAX_VALUE;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    maxModifiedProcId = Long.MIN_VALUE;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private BitSetNode getOrCreateNode(long procId) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    // If procId can fit in left node (directly or by growing it)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    BitSetNode leftNode = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    boolean leftCanGrow = false;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Map.Entry&lt;Long, BitSetNode&gt; leftEntry = map.floorEntry(procId);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (leftEntry != null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      leftNode = leftEntry.getValue();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      if (leftNode.contains(procId)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return leftNode;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      leftCanGrow = leftNode.canGrow(procId);<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>    // If procId can fit in right node (directly or by growing it)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    BitSetNode rightNode = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    boolean rightCanGrow = false;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    Map.Entry&lt;Long, BitSetNode&gt; rightEntry = map.ceilingEntry(procId);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (rightEntry != null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      rightNode = rightEntry.getValue();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      rightCanGrow = rightNode.canGrow(procId);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (leftNode != null) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (leftNode.canMerge(rightNode)) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          // merge left and right node<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          return mergeNodes(leftNode, rightNode);<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>        // If left and right nodes can not merge, decide which one to grow.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        if (leftCanGrow &amp;&amp; rightCanGrow) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if ((procId - leftNode.getEnd()) &lt;= (rightNode.getStart() - procId)) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            return growNode(leftNode, procId);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          return growNode(rightNode, procId);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // grow the left node<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    if (leftCanGrow) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      return growNode(leftNode, procId);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    // grow the right node<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (rightCanGrow) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      return growNode(rightNode, procId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // add new node if there are no left/right nodes which can be used.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    BitSetNode node = new BitSetNode(procId, partial);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    map.put(node.getStart(), node);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    return node;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * Keeps track of live procedures.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> *<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * It can be used by the ProcedureStore to identify which procedures are already<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * deleted/completed to avoid the deserialization step on restart<a name="line.36"></a>
+<span class="sourceLineNo">037</span> */<a name="line.37"></a>
+<span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
+<span class="sourceLineNo">039</span>@InterfaceStability.Evolving<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public class ProcedureStoreTracker {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  // Key is procedure id corresponding to first bit of the bitmap.<a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private final TreeMap&lt;Long, BitSetNode&gt; map = new TreeMap&lt;&gt;();<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>   * If true, do not remove bits corresponding to deleted procedures. Note that this can result<a name="line.45"></a>
+<span class="sourceLineNo">046</span>   * in huge bitmaps overtime.<a name="line.46"></a>
+<span class="sourceLineNo">047</span>   * Currently, it's set to true only when building tracker state from logs during recovery. During<a name="line.47"></a>
+<span class="sourceLineNo">048</span>   * recovery, if we are sure that a procedure has been deleted, reading its old update entries<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * can be skipped.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private boolean keepDeletes = false;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  /**<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * If true, it means tracker has incomplete information about the active/deleted procedures.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   * It's set to true only when recovering from old logs. See {@link #isDeleted(long)} docs to<a name="line.54"></a>
+<span class="sourceLineNo">055</span>   * understand it's real use.<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   */<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  boolean partial = false;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private long minModifiedProcId = Long.MAX_VALUE;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private long maxModifiedProcId = Long.MIN_VALUE;<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public enum DeleteState { YES, NO, MAYBE }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    reset();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      final BitSetNode node = new BitSetNode(protoNode);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      map.put(node.getStart(), node);<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><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Resets internal state to same as given {@code tracker}. Does deep copy of the bitmap.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public void resetTo(ProcedureStoreTracker tracker) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    resetTo(tracker, false);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  /**<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * Resets internal state to same as given {@code tracker}, and change the deleted flag according<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * to the modified flag if {@code resetDelete} is true. Does deep copy of the bitmap.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * &lt;p/&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * The {@code resetDelete} will be set to true when building cleanup tracker, please see the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * comments in {@link BitSetNode#BitSetNode(BitSetNode, boolean)} to learn how we change the<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * deleted flag if {@code resetDelete} is true.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public void resetTo(ProcedureStoreTracker tracker, boolean resetDelete) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    reset();<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    this.partial = tracker.partial;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    this.minModifiedProcId = tracker.minModifiedProcId;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    this.maxModifiedProcId = tracker.maxModifiedProcId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    this.keepDeletes = tracker.keepDeletes;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : tracker.map.entrySet()) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      map.put(entry.getKey(), new BitSetNode(entry.getValue(), resetDelete));<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><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  public void insert(long procId) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    insert(null, procId);<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>  public void insert(long[] procIds) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      insert(procIds[i]);<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><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public void insert(long procId, long[] subProcIds) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    BitSetNode node = update(null, procId);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    for (int i = 0; i &lt; subProcIds.length; ++i) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      node = insert(node, subProcIds[i]);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private BitSetNode insert(BitSetNode node, long procId) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (node == null || !node.contains(procId)) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      node = getOrCreateNode(procId);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    node.insertOrUpdate(procId);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    trackProcIds(procId);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return node;<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>  public void update(long procId) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    update(null, procId);<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>  private BitSetNode update(BitSetNode node, long procId) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    node = lookupClosestNode(node, procId);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assert node != null : "expected node to update procId=" + procId;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    node.insertOrUpdate(procId);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    trackProcIds(procId);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    return node;<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>  public void delete(long procId) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    delete(null, procId);<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>  public void delete(final long[] procIds) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    Arrays.sort(procIds);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    BitSetNode node = null;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      node = delete(node, procIds[i]);<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>  private BitSetNode delete(BitSetNode node, long procId) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    node = lookupClosestNode(node, procId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assert node != null : "expected node to delete procId=" + procId;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    node.delete(procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    if (!keepDeletes &amp;&amp; node.isEmpty()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      // TODO: RESET if (map.size() == 1)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      map.remove(node.getStart());<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>    trackProcIds(procId);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    return node;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * Will be called when restarting where we need to rebuild the ProcedureStoreTracker.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public void setMinMaxModifiedProcIds(long min, long max) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    this.minModifiedProcId = min;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    this.maxModifiedProcId = max;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  /**<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * This method is used when restarting where we need to rebuild the ProcedureStoreTracker. The<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * {@link #delete(long)} method above assume that the {@link BitSetNode} exists, but when restart<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * this is not true, as we will read the wal files in reverse order so a delete may come first.<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public void setDeleted(long procId, boolean isDeleted) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    BitSetNode node = getOrCreateNode(procId);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node=" + node;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    node.updateState(procId, isDeleted);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    trackProcIds(procId);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * Set the given bit for the procId to delete if it was modified before.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * &lt;p/&gt;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * This method is used to test whether a procedure wal file can be safely deleted, as if all the<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * procedures in the given procedure wal file has been modified in the new procedure wal files,<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * then we can delete it.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public void setDeletedIfModified(long... procId) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    BitSetNode node = null;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    for (int i = 0; i &lt; procId.length; ++i) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      node = lookupClosestNode(node, procId[i]);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      if (node != null &amp;&amp; node.isModified(procId[i])) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        node.delete(procId[i]);<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><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  /**<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * Similar with {@link #setDeletedIfModified(long...)}, but here the {@code procId} are given by<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * the {@code tracker}. If a procedure is modified by us, and also by the given {@code tracker},<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * then we mark it as deleted.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @see #setDeletedIfModified(long...)<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public void setDeletedIfModifiedInBoth(ProcedureStoreTracker tracker) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    BitSetNode trackerNode = null;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    for (BitSetNode node : map.values()) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      final long minProcId = node.getStart();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final long maxProcId = node.getEnd();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      for (long procId = minProcId; procId &lt;= maxProcId; ++procId) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        if (!node.isModified(procId)) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          continue;<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>        trackerNode = tracker.lookupClosestNode(trackerNode, procId);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (trackerNode == null || !trackerNode.contains(procId) ||<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          trackerNode.isModified(procId)) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          // the procedure was removed or modified<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          node.delete(procId);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  /**<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * lookup the node containing the specified procId.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param node cached node to check before doing a lookup<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param procId the procId to lookup<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * @return the node that may contains the procId or null<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  private BitSetNode lookupClosestNode(final BitSetNode node, final long procId) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    if (node != null &amp;&amp; node.contains(procId)) return node;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return entry != null ? entry.getValue() : null;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private void trackProcIds(long procId) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    minModifiedProcId = Math.min(minModifiedProcId, procId);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    maxModifiedProcId = Math.max(maxModifiedProcId, procId);<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>  public long getModifiedMinProcId() {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    return minModifiedProcId;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public long getModifiedMaxProcId() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return maxModifiedProcId;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  public void reset() {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.keepDeletes = false;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    this.partial = false;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    this.map.clear();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    resetModified();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public boolean isModified(long procId) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    return entry != null &amp;&amp; entry.getValue().contains(procId) &amp;&amp;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      entry.getValue().isModified(procId);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * If {@link #partial} is false, returns state from the bitmap. If no state is found for<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * {@code procId}, returns YES.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * If partial is true, tracker doesn't have complete view of system state, so it returns MAYBE<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   * if there is no update for the procedure or if it doesn't have a state in bitmap. Otherwise,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * returns state from the bitmap.<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public DeleteState isDeleted(long procId) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (entry != null &amp;&amp; entry.getValue().contains(procId)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      BitSetNode node = entry.getValue();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      DeleteState state = node.isDeleted(procId);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return partial &amp;&amp; !node.isModified(procId) ? DeleteState.MAYBE : state;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return partial ? DeleteState.MAYBE : DeleteState.YES;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public long getActiveMinProcId() {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // TODO: Cache?<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.firstEntry();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return entry == null ? 0 : entry.getValue().getActiveMinProcId();<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>  public void setKeepDeletes(boolean keepDeletes) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.keepDeletes = keepDeletes;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // If not to keep deletes, remove the BitSetNodes which are empty (i.e. contains ids of deleted<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    // procedures).<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    if (!keepDeletes) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      Iterator&lt;Map.Entry&lt;Long, BitSetNode&gt;&gt; it = map.entrySet().iterator();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      while (it.hasNext()) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        Map.Entry&lt;Long, BitSetNode&gt; entry = it.next();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        if (entry.getValue().isEmpty()) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          it.remove();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public boolean isPartial() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return partial;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void setPartialFlag(boolean isPartial) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (this.partial &amp;&amp; !isPartial) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        entry.getValue().unsetPartialFlag();<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>    this.partial = isPartial;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return true, if no procedure is active, else false.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public boolean isEmpty() {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      if (!entry.getValue().isEmpty()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return false;<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>    return true;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @return true if all procedure was modified or deleted since last call to<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   *         {@link #resetModified()}.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public boolean isAllModified() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      if (!entry.getValue().isAllModified()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        return false;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return true;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>  /**<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * Will be used when there are too many proc wal files. We will rewrite the states of the active<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   * procedures in the oldest proc wal file so that we can delete it.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @return all the active procedure ids in this tracker.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public long[] getAllActiveProcIds() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return map.values().stream().map(BitSetNode::getActiveProcIds).filter(p -&gt; p.length &gt; 0)<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      .flatMapToLong(LongStream::of).toArray();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Clears the list of updated procedure ids. This doesn't affect global list of active<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * procedure ids.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  public void resetModified() {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      entry.getValue().resetModified();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    minModifiedProcId = Long.MAX_VALUE;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    maxModifiedProcId = Long.MIN_VALUE;<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>  private BitSetNode getOrCreateNode(long procId) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // If procId can fit in left node (directly or by growing it)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    BitSetNode leftNode = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    boolean leftCanGrow = false;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    Map.Entry&lt;Long, BitSetNode&gt; leftEntry = map.floorEntry(procId);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    if (leftEntry != null) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      leftNode = leftEntry.getValue();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      if (leftNode.contains(procId)) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        return leftNode;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      leftCanGrow = leftNode.canGrow(procId);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>    // If procId can fit in right node (directly or by growing it)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    BitSetNode rightNode = null;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    boolean rightCanGrow = false;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Map.Entry&lt;Long, BitSetNode&gt; rightEntry = map.ceilingEntry(procId);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    if (rightEntry != null) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      rightNode = rightEntry.getValue();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      rightCanGrow = rightNode.canGrow(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      if (leftNode != null) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        if (leftNode.canMerge(rightNode)) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          // merge left and right node<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          return mergeNodes(leftNode, rightNode);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>        // If left and right nodes can not merge, decide which one to grow.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (leftCanGrow &amp;&amp; rightCanGrow) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          if ((procId - leftNode.getEnd()) &lt;= (rightNode.getStart() - procId)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            return growNode(leftNode, procId);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          return growNode(rightNode, procId);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // grow the left node<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    if (leftCanGrow) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      return growNode(leftNode, procId);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
 <span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  /**<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * Grows {@code node} to contain {@code procId} and updates the map.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @return {@link BitSetNode} instance which contains {@code procId}.<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private BitSetNode growNode(BitSetNode node, long procId) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    map.remove(node.getStart());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    node.grow(procId);<a name="line.408"></a>
+<span class="sourceLineNo">402</span>    // grow the right node<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    if (rightCanGrow) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      return growNode(rightNode, procId);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    // add new node if there are no left/right nodes which can be used.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    BitSetNode node = new BitSetNode(procId, partial);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>    map.put(node.getStart(), node);<a name="line.409"></a>
 <span class="sourceLineNo">410</span>    return node;<a name="line.410"></a>
 <span class="sourceLineNo">411</span>  }<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>   * Merges {@code leftNode} &amp; {@code rightNode} and updates the map.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   */<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private BitSetNode mergeNodes(BitSetNode leftNode, BitSetNode rightNode) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assert leftNode.getStart() &lt; rightNode.getStart();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    leftNode.merge(rightNode);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    map.remove(rightNode.getStart());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    return leftNode;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public void dump() {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    System.out.println("map " + map.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.out.println("isAllModified " + isAllModified());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    System.out.println("isEmpty " + isEmpty());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      entry.getValue().dump();<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><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // ========================================================================<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  //  Convert to/from Protocol Buffer.<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>  /**<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * Builds<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * protocol buffer from current state.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public ProcedureProtos.ProcedureStoreTracker toProto() throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ProcedureProtos.ProcedureStoreTracker.Builder builder =<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        ProcedureProtos.ProcedureStoreTracker.newBuilder();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      builder.addNode(entry.getValue().convert());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return builder.build();<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>}<a name="line.449"></a>
+<span class="sourceLineNo">414</span>   * Grows {@code node} to contain {@code procId} and updates the map.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @return {@link BitSetNode} instance which contains {@code procId}.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private BitSetNode growNode(BitSetNode node, long procId) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    map.remove(node.getStart());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    node.grow(procId);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    map.put(node.getStart(), node);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return node;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  /**<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   * Merges {@code leftNode} &amp; {@code rightNode} and updates the map.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   */<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  private BitSetNode mergeNodes(BitSetNode leftNode, BitSetNode rightNode) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    assert leftNode.getStart() &lt; rightNode.getStart();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    leftNode.merge(rightNode);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    map.remove(rightNode.getStart());<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    return leftNode;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public void dump() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    System.out.println("map " + map.size());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    System.out.println("isAllModified " + isAllModified());<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    System.out.println("isEmpty " + isEmpty());<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      entry.getValue().dump();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  //  Convert to/from Protocol Buffer.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  // ========================================================================<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Builds<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * protocol buffer from current state.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   */<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public ProcedureProtos.ProcedureStoreTracker toProto() throws IOException {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    ProcedureProtos.ProcedureStoreTracker.Builder builder =<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        ProcedureProtos.ProcedureStoreTracker.newBuilder();<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      builder.addNode(entry.getValue().convert());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return builder.build();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>}<a name="line.460"></a>
 
 
 


[03/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.html b/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.html
index 3cec086..4796b38 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.53">Action</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.55">Action</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">A (possibly mischievous) action that the ChaosMonkey can perform.</div>
 </li>
@@ -438,7 +438,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_MASTER_TIMEOUT_KEY</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/chaos/actions/Action.html#line.55">KILL_MASTER_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.57">KILL_MASTER_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_MASTER_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -451,7 +451,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_MASTER_TIMEOUT_KEY</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/chaos/actions/Action.html#line.57">START_MASTER_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.59">START_MASTER_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_MASTER_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -464,7 +464,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_RS_TIMEOUT_KEY</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/chaos/actions/Action.html#line.59">KILL_RS_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.61">KILL_RS_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_RS_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -477,7 +477,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_RS_TIMEOUT_KEY</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/chaos/actions/Action.html#line.60">START_RS_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.62">START_RS_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_RS_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -490,7 +490,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_ZK_NODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.61">KILL_ZK_NODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.63">KILL_ZK_NODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_ZK_NODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -503,7 +503,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_ZK_NODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.63">START_ZK_NODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.65">START_ZK_NODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_ZK_NODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -516,7 +516,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_DATANODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.65">KILL_DATANODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.67">KILL_DATANODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_DATANODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -529,7 +529,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_DATANODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.67">START_DATANODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.69">START_DATANODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_DATANODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -542,7 +542,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_NAMENODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.69">KILL_NAMENODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.71">KILL_NAMENODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_NAMENODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -555,7 +555,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_NAMENODE_TIMEOUT_KEY</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/chaos/actions/Action.html#line.71">START_NAMENODE_TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.73">START_NAMENODE_TIMEOUT_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_NAMENODE_TIMEOUT_KEY">Constant Field Values</a></dd>
@@ -568,7 +568,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.74">LOG</a></pre>
+<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.76">LOG</a></pre>
 </li>
 </ul>
 <a name="KILL_MASTER_TIMEOUT_DEFAULT">
@@ -577,7 +577,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_MASTER_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.76">KILL_MASTER_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.78">KILL_MASTER_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_MASTER_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -590,7 +590,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_MASTER_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.77">START_MASTER_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.79">START_MASTER_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_MASTER_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -603,7 +603,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_RS_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.78">KILL_RS_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.80">KILL_RS_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_RS_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -616,7 +616,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_RS_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.79">START_RS_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.81">START_RS_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_RS_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -629,7 +629,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_ZK_NODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.80">KILL_ZK_NODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.82">KILL_ZK_NODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_ZK_NODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -642,7 +642,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_ZK_NODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.81">START_ZK_NODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.83">START_ZK_NODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_ZK_NODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -655,7 +655,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_DATANODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.82">KILL_DATANODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.84">KILL_DATANODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_DATANODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -668,7 +668,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_DATANODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.83">START_DATANODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.85">START_DATANODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_DATANODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -681,7 +681,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KILL_NAMENODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.84">KILL_NAMENODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.86">KILL_NAMENODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.KILL_NAMENODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -694,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>START_NAMENODE_TIMEOUT_DEFAULT</h4>
-<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.85">START_NAMENODE_TIMEOUT_DEFAULT</a></pre>
+<pre>protected static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.87">START_NAMENODE_TIMEOUT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.chaos.actions.Action.START_NAMENODE_TIMEOUT_DEFAULT">Constant Field Values</a></dd>
@@ -707,7 +707,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>context</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html" title="class in org.apache.hadoop.hbase.chaos.actions">Action.ActionContext</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.87">context</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html" title="class in org.apache.hadoop.hbase.chaos.actions">Action.ActionContext</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.89">context</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -716,7 +716,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cluster</h4>
-<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.88">cluster</a></pre>
+<pre>protected&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.90">cluster</a></pre>
 </li>
 </ul>
 <a name="initialStatus">
@@ -725,7 +725,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initialStatus</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.ClusterMetrics <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.89">initialStatus</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.ClusterMetrics <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.91">initialStatus</a></pre>
 </li>
 </ul>
 <a name="initialServers">
@@ -734,7 +734,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initialServers</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.ServerName[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.90">initialServers</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.ServerName[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.92">initialServers</a></pre>
 </li>
 </ul>
 <a name="killMasterTimeout">
@@ -743,7 +743,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killMasterTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.92">killMasterTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.94">killMasterTimeout</a></pre>
 </li>
 </ul>
 <a name="startMasterTimeout">
@@ -752,7 +752,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startMasterTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.93">startMasterTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.95">startMasterTimeout</a></pre>
 </li>
 </ul>
 <a name="killRsTimeout">
@@ -761,7 +761,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killRsTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.94">killRsTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.96">killRsTimeout</a></pre>
 </li>
 </ul>
 <a name="startRsTimeout">
@@ -770,7 +770,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRsTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.95">startRsTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.97">startRsTimeout</a></pre>
 </li>
 </ul>
 <a name="killZkNodeTimeout">
@@ -779,7 +779,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killZkNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.96">killZkNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.98">killZkNodeTimeout</a></pre>
 </li>
 </ul>
 <a name="startZkNodeTimeout">
@@ -788,7 +788,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startZkNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.97">startZkNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.99">startZkNodeTimeout</a></pre>
 </li>
 </ul>
 <a name="killDataNodeTimeout">
@@ -797,7 +797,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killDataNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.98">killDataNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.100">killDataNodeTimeout</a></pre>
 </li>
 </ul>
 <a name="startDataNodeTimeout">
@@ -806,7 +806,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startDataNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.99">startDataNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.101">startDataNodeTimeout</a></pre>
 </li>
 </ul>
 <a name="killNameNodeTimeout">
@@ -815,7 +815,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killNameNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.100">killNameNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.102">killNameNodeTimeout</a></pre>
 </li>
 </ul>
 <a name="startNameNodeTimeout">
@@ -824,7 +824,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>startNameNodeTimeout</h4>
-<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.101">startNameNodeTimeout</a></pre>
+<pre>protected&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.103">startNameNodeTimeout</a></pre>
 </li>
 </ul>
 </li>
@@ -841,7 +841,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Action</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.53">Action</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.55">Action</a>()</pre>
 </li>
 </ul>
 </li>
@@ -858,7 +858,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.103">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html" title="class in org.apache.hadoop.hbase.chaos.actions">Action.ActionContext</a>&nbsp;context)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.105">init</a>(<a href="../../../../../../org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html" title="class in org.apache.hadoop.hbase.chaos.actions">Action.ActionContext</a>&nbsp;context)
           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>
@@ -872,7 +872,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>perform</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.131">perform</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.133">perform</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -886,7 +886,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentServers</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.ServerName[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.134">getCurrentServers</a>()
+<pre>protected&nbsp;org.apache.hadoop.hbase.ServerName[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.136">getCurrentServers</a>()
                                                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Returns current region servers - active master</div>
 <dl>
@@ -901,7 +901,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killMaster</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.154">killMaster</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.153">killMaster</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                    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>
@@ -915,7 +915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startMaster</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.161">startMaster</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.160">startMaster</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                     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>
@@ -929,7 +929,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killRs</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.168">killRs</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.167">killRs</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                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>
@@ -943,7 +943,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRs</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.176">startRs</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.175">startRs</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                 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>
@@ -957,7 +957,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killZKNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.184">killZKNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.183">killZKNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                    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>
@@ -971,7 +971,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startZKNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.192">startZKNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.191">startZKNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                     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>
@@ -985,7 +985,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killDataNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.199">killDataNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.198">killDataNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                      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>
@@ -999,7 +999,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startDataNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.207">startDataNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.206">startDataNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                       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>
@@ -1013,7 +1013,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killNameNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.214">killNameNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.213">killNameNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                      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>
@@ -1027,7 +1027,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startNameNode</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.222">startNameNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.221">startNameNode</a>(org.apache.hadoop.hbase.ServerName&nbsp;server)
                       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>
@@ -1041,7 +1041,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>unbalanceRegions</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.228">unbalanceRegions</a>(org.apache.hadoop.hbase.ClusterMetrics&nbsp;clusterStatus,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.227">unbalanceRegions</a>(org.apache.hadoop.hbase.ClusterMetrics&nbsp;clusterStatus,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.ServerName&gt;&nbsp;fromServers,
                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.ServerName&gt;&nbsp;toServers,
                                 double&nbsp;fractionOfRegions)
@@ -1058,7 +1058,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>forceBalancer</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.261">forceBalancer</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.260">forceBalancer</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1072,7 +1072,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getConf</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.274">getConf</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.273">getConf</a>()</pre>
 </li>
 </ul>
 <a name="modifyAllTableColumns-org.apache.hadoop.hbase.TableName-java.util.function.BiConsumer-">
@@ -1081,7 +1081,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>modifyAllTableColumns</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.283">modifyAllTableColumns</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.282">modifyAllTableColumns</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/BiConsumer.html?is-external=true" title="class or interface in java.util.function">BiConsumer</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>,org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder&gt;&nbsp;transform)
                               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">Apply a transform to all columns in a given table. If there are no columns in a table or if the context is stopping does nothing.</div>
@@ -1100,7 +1100,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>modifyAllTableColumns</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.313">modifyAllTableColumns</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.312">modifyAllTableColumns</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Consumer.html?is-external=true" title="class or interface in java.util.function">Consumer</a>&lt;org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder&gt;&nbsp;transform)
                               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">Apply a transform to all columns in a given table. If there are no columns in a table or if the context is stopping does nothing.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
index adf353c..a8a3ae3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseClassTestRule.html
@@ -4223,6 +4223,10 @@
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TestWALProcedureStore.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestForceUpdateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseCommonTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseCommonTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseCommonTestingUtility.html
index 25560b2..8ac579a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseCommonTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/class-use/HBaseCommonTestingUtility.html
@@ -301,6 +301,10 @@
 <td class="colFirst"><code>protected static <a href="../../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtility</a></code></td>
 <td class="colLast"><span class="typeNameLabel">ProcedureWALPerformanceEvaluation.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html#UTIL">UTIL</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static <a href="../../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseCommonTestingUtility</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TestForceUpdateProcedure.</span><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#UTIL">UTIL</a></span></code>&nbsp;</td>
+</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 4837d80..ec56445 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html
index 94f2d9dd..7b22076 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.316">MockMasterServices.MockRegionStateStore</a>
+<pre>private static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.323">MockMasterServices.MockRegionStateStore</a>
 extends org.apache.hadoop.hbase.master.assignment.RegionStateStore</pre>
 </li>
 </ul>
@@ -224,7 +224,7 @@ extends org.apache.hadoop.hbase.master.assignment.RegionStateStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MockRegionStateStore</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html#line.317">MockRegionStateStore</a>(org.apache.hadoop.hbase.master.MasterServices&nbsp;master)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html#line.324">MockRegionStateStore</a>(org.apache.hadoop.hbase.master.MasterServices&nbsp;master)</pre>
 </li>
 </ul>
 </li>
@@ -241,7 +241,7 @@ extends org.apache.hadoop.hbase.master.assignment.RegionStateStore</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>updateRegionLocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html#line.322">updateRegionLocation</a>(org.apache.hadoop.hbase.master.assignment.RegionStateNode&nbsp;regionNode)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.MockRegionStateStore.html#line.329">updateRegionLocation</a>(org.apache.hadoop.hbase.master.assignment.RegionStateNode&nbsp;regionNode)
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html
index 1003faf..8485393 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.85">MockMasterServices</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.86">MockMasterServices</a>
 extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMasterServices.html" title="class in org.apache.hadoop.hbase.master">MockNoopMasterServices</a></pre>
 <div class="block">A mocked master services.
  Tries to fake it. May not always work.</div>
@@ -364,7 +364,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>fileSystemManager</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.MasterFileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.86">fileSystemManager</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.MasterFileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.87">fileSystemManager</a></pre>
 </li>
 </ul>
 <a name="walManager">
@@ -373,7 +373,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>walManager</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.MasterWalManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.87">walManager</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.MasterWalManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.88">walManager</a></pre>
 </li>
 </ul>
 <a name="assignmentManager">
@@ -382,7 +382,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>assignmentManager</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.assignment.AssignmentManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.88">assignmentManager</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.assignment.AssignmentManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.89">assignmentManager</a></pre>
 </li>
 </ul>
 <a name="tableStateManager">
@@ -391,7 +391,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>tableStateManager</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.TableStateManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.89">tableStateManager</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.TableStateManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.90">tableStateManager</a></pre>
 </li>
 </ul>
 <a name="procedureEnv">
@@ -400,7 +400,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureEnv</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.91">procedureEnv</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.92">procedureEnv</a></pre>
 </li>
 </ul>
 <a name="procedureExecutor">
@@ -409,7 +409,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureExecutor</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.92">procedureExecutor</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.93">procedureExecutor</a></pre>
 </li>
 </ul>
 <a name="procedureStore">
@@ -418,7 +418,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureStore</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.procedure2.store.ProcedureStore <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.93">procedureStore</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.procedure2.store.ProcedureStore <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.94">procedureStore</a></pre>
 </li>
 </ul>
 <a name="connection">
@@ -427,7 +427,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.ClusterConnection <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.94">connection</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.ClusterConnection <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.95">connection</a></pre>
 </li>
 </ul>
 <a name="balancer">
@@ -436,7 +436,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>balancer</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.LoadBalancer <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.95">balancer</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.LoadBalancer <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.96">balancer</a></pre>
 </li>
 </ul>
 <a name="serverManager">
@@ -445,7 +445,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>serverManager</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.master.ServerManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.96">serverManager</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.master.ServerManager <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.97">serverManager</a></pre>
 </li>
 </ul>
 <a name="regionsToRegionServers">
@@ -454,7 +454,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsToRegionServers</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;org.apache.hadoop.hbase.ServerName,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;byte[]&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.98">regionsToRegionServers</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;org.apache.hadoop.hbase.ServerName,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;byte[]&gt;&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.99">regionsToRegionServers</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -463,7 +463,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureEvent <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.100">initialized</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureEvent <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.101">initialized</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_COLUMN_FAMILY_NAME">
@@ -472,7 +472,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_COLUMN_FAMILY_NAME</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/master/assignment/MockMasterServices.html#line.101">DEFAULT_COLUMN_FAMILY_NAME</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.102">DEFAULT_COLUMN_FAMILY_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.master.assignment.MockMasterServices.DEFAULT_COLUMN_FAMILY_NAME">Constant Field Values</a></dd>
@@ -485,7 +485,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MOCK_MASTER_SERVERNAME</h4>
-<pre>public static final&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.102">MOCK_MASTER_SERVERNAME</a></pre>
+<pre>public static final&nbsp;org.apache.hadoop.hbase.ServerName <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.103">MOCK_MASTER_SERVERNAME</a></pre>
 </li>
 </ul>
 </li>
@@ -502,7 +502,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MockMasterServices</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.105">MockMasterServices</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.106">MockMasterServices</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/NavigableMap.html?is-external=true" title="class or interface in java.util">NavigableMap</a>&lt;org.apache.hadoop.hbase.ServerName,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html?is-external=true" title="class or interface in java.util">SortedSet</a>&lt;byte[]&gt;&gt;&nbsp;regionsToRegionServers)
                    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>
@@ -525,7 +525,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.178">start</a>(int&nbsp;numServes,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.179">start</a>(int&nbsp;numServes,
                   org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher&nbsp;remoteDispatcher)
            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>,
                   org.apache.zookeeper.KeeperException</pre>
@@ -542,7 +542,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>restartRegionServer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.197">restartRegionServer</a>(org.apache.hadoop.hbase.ServerName&nbsp;serverName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.198">restartRegionServer</a>(org.apache.hadoop.hbase.ServerName&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>
 <div class="block">Call this restart method only after running MockMasterServices#start()
  The RSs can be differentiated by the port number, see
@@ -562,7 +562,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.214">stop</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;why)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.215">stop</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;why)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>stop</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.Stoppable</code></dd>
@@ -577,7 +577,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>startProcedureExecutor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.219">startProcedureExecutor</a>(org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher&nbsp;remoteDispatcher)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.220">startProcedureExecutor</a>(org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher&nbsp;remoteDispatcher)
                              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>
@@ -591,7 +591,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>stopProcedureExecutor</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.242">stopProcedureExecutor</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.249">stopProcedureExecutor</a>()</pre>
 </li>
 </ul>
 <a name="isInitialized--">
@@ -600,7 +600,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>isInitialized</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.257">isInitialized</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.264">isInitialized</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>isInitialized</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -615,7 +615,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getInitializedEvent</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureEvent&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.262">getInitializedEvent</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureEvent&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.269">getInitializedEvent</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getInitializedEvent</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -630,7 +630,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.MasterFileSystem&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.267">getMasterFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.MasterFileSystem&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.274">getMasterFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterFileSystem</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -645,7 +645,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterWalManager</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.MasterWalManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.272">getMasterWalManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.MasterWalManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.279">getMasterWalManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterWalManager</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -660,7 +660,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterProcedureExecutor</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.277">getMasterProcedureExecutor</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.284">getMasterProcedureExecutor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getMasterProcedureExecutor</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -675,7 +675,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getLoadBalancer</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.LoadBalancer&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.282">getLoadBalancer</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.LoadBalancer&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.289">getLoadBalancer</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getLoadBalancer</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -690,7 +690,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerManager</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.ServerManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.287">getServerManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.ServerManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.294">getServerManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getServerManager</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -705,7 +705,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getAssignmentManager</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.assignment.AssignmentManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.292">getAssignmentManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.assignment.AssignmentManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.299">getAssignmentManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getAssignmentManager</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -720,7 +720,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStateManager</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.master.TableStateManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.297">getTableStateManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.master.TableStateManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.304">getTableStateManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getTableStateManager</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -735,7 +735,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getConnection</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.ClusterConnection&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.302">getConnection</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.client.ClusterConnection&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.309">getConnection</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getConnection</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.Server</code></dd>
@@ -750,7 +750,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerName</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.ServerName&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.307">getServerName</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.ServerName&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.314">getServerName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getServerName</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.Server</code></dd>
@@ -765,7 +765,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoordinatedStateManager</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.CoordinatedStateManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.312">getCoordinatedStateManager</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.CoordinatedStateManager&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.319">getCoordinatedStateManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getCoordinatedStateManager</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.Server</code></dd>
@@ -780,7 +780,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptors</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.TableDescriptors&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.327">getTableDescriptors</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.TableDescriptors&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.334">getTableDescriptors</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getTableDescriptors</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.master.MasterServices</code></dd>
@@ -795,7 +795,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/master/MockNoopMaster
 <ul class="blockListLast">
 <li class="blockList">
 <h4>buildMultiResponse</h4>
-<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.368">buildMultiResponse</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest&nbsp;req)</pre>
+<pre>private static&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiResponse&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#line.375">buildMultiResponse</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.MultiRequest&nbsp;req)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index eb35811..3b51276 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -579,15 +579,15 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 037e54a..3661437 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -214,8 +214,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
 </ul>
 </li>


[10/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
index f9d05cb..67f0fc6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
@@ -31,316 +31,325 @@
 <span class="sourceLineNo">023</span>import java.lang.reflect.Constructor;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.lang.reflect.InvocationTargetException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> */<a name="line.37"></a>
-<span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class JVMClusterUtil {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  public static class RegionServerThread extends Thread {<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final HRegionServer regionServer;<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.49"></a>
-<span class="sourceLineNo">050</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public HRegionServer getRegionServer() {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.59"></a>
-<span class="sourceLineNo">060</span>     * to be used.<a name="line.60"></a>
-<span class="sourceLineNo">061</span>     */<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    public void waitForServerOnline() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      // The server is marked online after the init method completes inside of<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      regionServer.waitForServerOnline();<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<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>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Creates a {@link RegionServerThread}.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * Call 'start' on the returned thread to make it run.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * @param c Configuration to use.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * @param hrsc Class to create.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @param index Used distinguishing the object returned.<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @throws IOException<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * @return Region server added.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    HRegionServer server;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    try {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ctor.setAccessible(true);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      server = ctor.newInstance(c);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    } catch (InvocationTargetException ite) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      Throwable target = ite.getTargetException();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          target.getCause().getMessage(): ""), target);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    } catch (Exception e) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      IOException ioe = new IOException();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      ioe.initCause(e);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      throw ioe;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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">026</span>import java.util.concurrent.TimeUnit;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.function.Supplier;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<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 JVMClusterUtil {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public static class RegionServerThread extends Thread {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final HRegionServer regionServer;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.50"></a>
+<span class="sourceLineNo">051</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    public HRegionServer getRegionServer() {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * to be used.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    public void waitForServerOnline() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      // The server is marked online after the init method completes inside of<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      regionServer.waitForServerOnline();<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><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Creates a {@link RegionServerThread}.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Call 'start' on the returned thread to make it run.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param c Configuration to use.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @param hrsc Class to create.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @param index Used distinguishing the object returned.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @throws IOException<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return Region server added.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    HRegionServer server;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    try {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ctor.setAccessible(true);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      server = ctor.newInstance(c);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    } catch (InvocationTargetException ite) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      Throwable target = ite.getTargetException();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          target.getCause().getMessage(): ""), target);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    } catch (Exception e) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      IOException ioe = new IOException();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      ioe.initCause(e);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      throw ioe;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * Datastructure to hold Master Thread and Master instance<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public static class MasterThread extends Thread {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private final HMaster master;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public MasterThread(final HMaster m, final int index) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.master = m;<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>    /** @return the master */<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public HMaster getMaster() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return this.master;<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><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * Creates a {@link MasterThread}.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Call 'start' on the returned thread to make it run.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param c Configuration to use.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @param hmc Class to create.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * @param index Used distinguishing the object returned.<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @throws IOException<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return Master added.<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    HMaster server;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    try {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    } catch (InvocationTargetException ite) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      Throwable target = ite.getTargetException();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          target.getCause().getMessage(): ""), target);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    } catch (Exception e) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      IOException ioe = new IOException();<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      ioe.initCause(e);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      throw ioe;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      if (t.master.isActiveMaster()) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        return t;<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>    return null;<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>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * and returns its address.<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param masters<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @param regionservers<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * @return Address to use contacting primary master.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>    Configuration configuration = null;<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    if (masters == null || masters.isEmpty()) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      configuration = t.getMaster().getConfiguration();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      t.start();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // Wait for an active master<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    //  having an active master before starting the region threads allows<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    //  then to succeed on their connection to master<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    long startTime = System.currentTimeMillis();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    while (findActiveMaster(masters) == null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        Thread.sleep(100);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      } catch (InterruptedException e) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      int startTimeout = configuration != null ? Integer.parseInt(<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (System.currentTimeMillis() &gt; startTime + startTimeout) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        String msg = "Master not active after " + startTimeout + "ms";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        throw new RuntimeException(msg);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    if (regionservers != null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        t.start();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // Wait for an active master to be initialized (implies being master)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    //  with this, when we return the cluster is complete<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    startTime = System.currentTimeMillis();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    final int maxwait = 200000;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    while (true) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      if (t != null &amp;&amp; t.master.isInitialized()) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        return t.master.getServerName().toString();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      // REMOVE<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      if (System.currentTimeMillis() &gt; startTime + 10000) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          Thread.sleep(1000);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        } catch (InterruptedException e) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (System.currentTimeMillis() &gt; startTime + maxwait) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        String msg = "Master not initialized after " + maxwait + "ms seconds";<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        throw new RuntimeException(msg);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      try {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        Thread.sleep(100);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      } catch (InterruptedException e) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<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>  }<a name="line.230"></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>   * Datastructure to hold Master Thread and Master instance<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static class MasterThread extends Thread {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    private final HMaster master;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public MasterThread(final HMaster m, final int index) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      this.master = m;<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>    /** @return the master */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    public HMaster getMaster() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      return this.master;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Creates a {@link MasterThread}.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Call 'start' on the returned thread to make it run.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param c Configuration to use.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * @param hmc Class to create.<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * @param index Used distinguishing the object returned.<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @throws IOException<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * @return Master added.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    HMaster server;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    } catch (InvocationTargetException ite) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      Throwable target = ite.getTargetException();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          target.getCause().getMessage(): ""), target);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    } catch (Exception e) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      IOException ioe = new IOException();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      ioe.initCause(e);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      throw ioe;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      if (t.master.isActiveMaster()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        return t;<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><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return null;<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">158</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * and returns its address.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * @param masters<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * @param regionservers<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @return Address to use contacting primary master.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Implementation note: This method relies on timed sleeps in a loop. It's not great, and<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    // should probably be re-written to use actual synchronization objects, but it's ok for now<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Configuration configuration = null;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    if (masters == null || masters.isEmpty()) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      configuration = t.getMaster().getConfiguration();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      t.start();<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>    // Wait for an active master<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    //  having an active master before starting the region threads allows<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    //  then to succeed on their connection to master<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final int startTimeout = configuration != null ? Integer.parseInt(<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    waitForEvent(startTimeout, "active", () -&gt; findActiveMaster(masters) != null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (regionservers != null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        t.start();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>    // Wait for an active master to be initialized (implies being master)<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    //  with this, when we return the cluster is complete<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final int initTimeout = configuration != null ? Integer.parseInt(<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        configuration.get("hbase.master.init.timeout.localHBaseCluster", "200000")) : 200000;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    waitForEvent(initTimeout, "initialized", () -&gt; {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        // master thread should never be null at this point, but let's keep the check anyway<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        return t != null &amp;&amp; t.master.isInitialized();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    );<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return findActiveMaster(masters).master.getServerName().toString();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Utility method to wait some time for an event to occur, and then return control to the caller.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param millis How long to wait, in milliseconds.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @param action The action that we are waiting for. Will be used in log message if the event<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   *               does not occur.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param check A Supplier that will be checked periodically to produce an updated true/false<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   *              result indicating if the expected event has happened or not.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @throws InterruptedIOException If we are interrupted while waiting for the event.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @throws RuntimeException If we reach the specified timeout while waiting for the event.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  private static void waitForEvent(long millis, String action, Supplier&lt;Boolean&gt; check)<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      throws InterruptedIOException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    long end = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(millis);<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    while (true) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      if (check.get()) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        return;<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>      if (System.nanoTime() &gt; end) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        String msg = "Master not " + action + " after " + millis + "ms";<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        throw new RuntimeException(msg);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
 <span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param masters<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param regionservers<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (masters != null) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      // Do backups first.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        if (!t.master.isActiveMaster()) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          try {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            t.master.stopMaster();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          } catch (IOException e) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        } else {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          activeMaster = t;<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>      // Do active after.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      if (activeMaster != null) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        try {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          activeMaster.master.shutdown();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (IOException e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    boolean wasInterrupted = false;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (regionservers != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      // first try nicely.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      for (RegionServerThread t : regionservers) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionServerThread t : regionservers) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        long now = System.currentTimeMillis();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            t.join(maxTime - now);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          } catch (InterruptedException e) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.275"></a>
-<span class="sourceLineNo">276</span>                "not waiting anymore on region server ends", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          }<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>      // Let's try to interrupt the remaining threads if any.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        boolean atLeastOneLiveServer = false;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        for (RegionServerThread t : regionservers) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          if (t.isAlive()) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            atLeastOneLiveServer = true;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              t.join(1000);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>              wasInterrupted = true;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        if (!atLeastOneLiveServer) break;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        for (RegionServerThread t : regionservers) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (t.isAlive()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              "if &gt; 3 attempts: i=" + i);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            if (i &gt; 3) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            t.interrupt();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (masters != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.314"></a>
-<span class="sourceLineNo">315</span>            // tests.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>            // this.master.join():<a name="line.316"></a>
-<span class="sourceLineNo">317</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          } catch(InterruptedException e) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.319"></a>
-<span class="sourceLineNo">320</span>                "not waiting anymore on master ends", e);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>            wasInterrupted = true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Shutdown of " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (wasInterrupted){<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Thread.currentThread().interrupt();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>}<a name="line.335"></a>
+<span class="sourceLineNo">232</span>      try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        Thread.sleep(100);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      } catch (InterruptedException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<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>   * @param masters<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param regionservers<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (masters != null) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // Do backups first.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        if (!t.master.isActiveMaster()) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            t.master.stopMaster();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          activeMaster = t;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      // Do active after.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (activeMaster != null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          activeMaster.master.shutdown();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        } catch (IOException e) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<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>    boolean wasInterrupted = false;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    if (regionservers != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      // first try nicely.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      for (RegionServerThread t : regionservers) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      for (RegionServerThread t : regionservers) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        long now = System.currentTimeMillis();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            t.join(maxTime - now);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          } catch (InterruptedException e) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                "not waiting anymore on region server ends", e);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>      // Let's try to interrupt the remaining threads if any.<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        boolean atLeastOneLiveServer = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        for (RegionServerThread t : regionservers) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          if (t.isAlive()) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            atLeastOneLiveServer = true;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.298"></a>
+<span class="sourceLineNo">299</span>              t.join(1000);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            } catch (InterruptedException e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              wasInterrupted = true;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        if (!atLeastOneLiveServer) break;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        for (RegionServerThread t : regionservers) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          if (t.isAlive()) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.308"></a>
+<span class="sourceLineNo">309</span>              "if &gt; 3 attempts: i=" + i);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            if (i &gt; 3) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>            t.interrupt();<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>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    if (masters != null) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          try {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            // tests.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            // this.master.join():<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          } catch(InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.328"></a>
+<span class="sourceLineNo">329</span>                "not waiting anymore on master ends", e);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            wasInterrupted = true;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    LOG.info("Shutdown of " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (wasInterrupted){<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>}<a name="line.344"></a>
 
 
 


[32/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
deleted file mode 100644
index 810ec00..0000000
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html
+++ /dev/null
@@ -1,244 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html lang="en">
-<head>
-<title>Source code</title>
-<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
-</head>
-<body>
-<div class="sourceContainer">
-<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
-<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
-<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
-<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
-<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
-<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
-<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
-<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
-<span class="sourceLineNo">009</span> *<a name="line.9"></a>
-<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
-<span class="sourceLineNo">011</span> *<a name="line.11"></a>
-<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
-<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
-<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
-<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
-<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
-<span class="sourceLineNo">017</span> */<a name="line.17"></a>
-<span class="sourceLineNo">018</span><a name="line.18"></a>
-<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.master.procedure;<a name="line.19"></a>
-<span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.io.IOException;<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.fs.FileSystem;<a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.fs.Path;<a name="line.24"></a>
-<span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.conf.ConfigurationObserver;<a name="line.25"></a>
-<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.ipc.RpcServer;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.apache.hadoop.hbase.master.MasterCoprocessorHost;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.apache.hadoop.hbase.master.MasterFileSystem;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.apache.hadoop.hbase.master.MasterServices;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.master.replication.ReplicationPeerManager;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.ProcedureEvent;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.User;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.CancelableProgressable;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.FSUtils;<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.apache.yetus.audience.InterfaceStability;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a name="line.45"></a>
-<span class="sourceLineNo">046</span>@InterfaceStability.Evolving<a name="line.46"></a>
-<span class="sourceLineNo">047</span>public class MasterProcedureEnv implements ConfigurationObserver {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureEnv.class);<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  @InterfaceAudience.Private<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public static class WALStoreLeaseRecovery implements WALProcedureStore.LeaseRecovery {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    private final MasterServices master;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public WALStoreLeaseRecovery(final MasterServices master) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      this.master = master;<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>    public void recoverFileLease(final FileSystem fs, final Path path) throws IOException {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      final Configuration conf = master.getConfiguration();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      final FSUtils fsUtils = FSUtils.getInstance(fs, conf);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      fsUtils.recoverFileLease(fs, path, conf, new CancelableProgressable() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>        @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        public boolean progress() {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>          LOG.debug("Recover Procedure Store log lease: " + path);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>          return isRunning();<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>    }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private boolean isRunning() {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      return !master.isStopped() &amp;&amp; !master.isStopping() &amp;&amp; !master.isAborted();<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><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @InterfaceAudience.Private<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static class MasterProcedureStoreListener<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      implements ProcedureStore.ProcedureStoreListener {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    private final MasterServices master;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public MasterProcedureStoreListener(final MasterServices master) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      this.master = master;<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>    public void postSync() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      // no-op<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 abortProcess() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      master.abort("The Procedure Store lost the lease", null);<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>  private final RSProcedureDispatcher remoteDispatcher;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final MasterProcedureScheduler procSched;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private final MasterServices master;<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public MasterProcedureEnv(final MasterServices master) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    this(master, new RSProcedureDispatcher(master));<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>  public MasterProcedureEnv(final MasterServices master,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      final RSProcedureDispatcher remoteDispatcher) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    this.master = master;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    this.procSched = new MasterProcedureScheduler();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.remoteDispatcher = remoteDispatcher;<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>  public User getRequestUser() {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return RpcServer.getRequestUser().orElse(Superusers.getSystemUser());<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>  public MasterServices getMasterServices() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return master;<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>  public Configuration getMasterConfiguration() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return master.getConfiguration();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public AssignmentManager getAssignmentManager() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return master.getAssignmentManager();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public MasterCoprocessorHost getMasterCoprocessorHost() {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return master.getMasterCoprocessorHost();<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>  public MasterProcedureScheduler getProcedureScheduler() {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return procSched;<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>  public RSProcedureDispatcher getRemoteDispatcher() {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    return remoteDispatcher;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
-<span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return master.getReplicationPeerManager();<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>  public MasterFileSystem getMasterFileSystem() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return master.getMasterFileSystem();<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>  public boolean isRunning() {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (this.master == null || this.master.getMasterProcedureExecutor() == null) return false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return master.getMasterProcedureExecutor().isRunning();<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>  public boolean isInitialized() {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return master.isInitialized();<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>  public boolean waitInitialized(Procedure&lt;?&gt; proc) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return master.getInitializedEvent().suspendIfNotReady(proc);<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 setEventReady(ProcedureEvent&lt;?&gt; event, boolean isReady) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    if (isReady) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      event.wake(procSched);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      event.suspend();<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><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public void onConfigurationChange(Configuration conf) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    master.getMasterProcedureExecutor().refreshConfiguration(conf);<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>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-</pre>
-</div>
-</body>
-</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
index 810ec00..acd402d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html
@@ -39,145 +39,124 @@
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.master.replication.ReplicationPeerManager;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.ProcedureEvent;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.User;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.CancelableProgressable;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.FSUtils;<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.apache.yetus.audience.InterfaceStability;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a name="line.45"></a>
-<span class="sourceLineNo">046</span>@InterfaceStability.Evolving<a name="line.46"></a>
-<span class="sourceLineNo">047</span>public class MasterProcedureEnv implements ConfigurationObserver {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureEnv.class);<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  @InterfaceAudience.Private<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public static class WALStoreLeaseRecovery implements WALProcedureStore.LeaseRecovery {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    private final MasterServices master;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public WALStoreLeaseRecovery(final MasterServices master) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      this.master = master;<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>    public void recoverFileLease(final FileSystem fs, final Path path) throws IOException {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      final Configuration conf = master.getConfiguration();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      final FSUtils fsUtils = FSUtils.getInstance(fs, conf);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      fsUtils.recoverFileLease(fs, path, conf, new CancelableProgressable() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>        @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        public boolean progress() {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>          LOG.debug("Recover Procedure Store log lease: " + path);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>          return isRunning();<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>    }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private boolean isRunning() {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      return !master.isStopped() &amp;&amp; !master.isStopping() &amp;&amp; !master.isAborted();<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><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @InterfaceAudience.Private<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static class MasterProcedureStoreListener<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      implements ProcedureStore.ProcedureStoreListener {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    private final MasterServices master;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public MasterProcedureStoreListener(final MasterServices master) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      this.master = master;<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>    public void postSync() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      // no-op<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.User;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.CancelableProgressable;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.FSUtils;<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.apache.yetus.audience.InterfaceStability;<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>@InterfaceAudience.Private<a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceStability.Evolving<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class MasterProcedureEnv implements ConfigurationObserver {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureEnv.class);<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 static class WALStoreLeaseRecovery implements WALProcedureStore.LeaseRecovery {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    private final MasterServices master;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>    public WALStoreLeaseRecovery(final MasterServices master) {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>      this.master = master;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    }<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 void recoverFileLease(final FileSystem fs, final Path path) throws IOException {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      final Configuration conf = master.getConfiguration();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      final FSUtils fsUtils = FSUtils.getInstance(fs, conf);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      fsUtils.recoverFileLease(fs, path, conf, new CancelableProgressable() {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>        @Override<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        public boolean progress() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>          LOG.debug("Recover Procedure Store log lease: " + path);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>          return isRunning();<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>    }<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    private boolean isRunning() {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      return !master.isStopped() &amp;&amp; !master.isStopping() &amp;&amp; !master.isAborted();<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><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final RSProcedureDispatcher remoteDispatcher;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final MasterProcedureScheduler procSched;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private final MasterServices master;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  public MasterProcedureEnv(final MasterServices master) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    this(master, new RSProcedureDispatcher(master));<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>  public MasterProcedureEnv(final MasterServices master,<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      final RSProcedureDispatcher remoteDispatcher) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    this.master = master;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    this.procSched = new MasterProcedureScheduler();<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    this.remoteDispatcher = remoteDispatcher;<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 abortProcess() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      master.abort("The Procedure Store lost the lease", null);<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>  private final RSProcedureDispatcher remoteDispatcher;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final MasterProcedureScheduler procSched;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private final MasterServices master;<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public MasterProcedureEnv(final MasterServices master) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    this(master, new RSProcedureDispatcher(master));<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>  public MasterProcedureEnv(final MasterServices master,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      final RSProcedureDispatcher remoteDispatcher) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    this.master = master;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    this.procSched = new MasterProcedureScheduler();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.remoteDispatcher = remoteDispatcher;<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>  public User getRequestUser() {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return RpcServer.getRequestUser().orElse(Superusers.getSystemUser());<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>  public MasterServices getMasterServices() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return master;<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>  public Configuration getMasterConfiguration() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return master.getConfiguration();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public AssignmentManager getAssignmentManager() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return master.getAssignmentManager();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public MasterCoprocessorHost getMasterCoprocessorHost() {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return master.getMasterCoprocessorHost();<a name="line.128"></a>
+<span class="sourceLineNo">090</span>  public User getRequestUser() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return RpcServer.getRequestUser().orElse(Superusers.getSystemUser());<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public MasterServices getMasterServices() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return master;<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>  public Configuration getMasterConfiguration() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return master.getConfiguration();<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>  public AssignmentManager getAssignmentManager() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return master.getAssignmentManager();<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>  public MasterCoprocessorHost getMasterCoprocessorHost() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    return master.getMasterCoprocessorHost();<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>  public MasterProcedureScheduler getProcedureScheduler() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    return procSched;<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>  public RSProcedureDispatcher getRemoteDispatcher() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return remoteDispatcher;<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>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    return master.getReplicationPeerManager();<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>  public MasterFileSystem getMasterFileSystem() {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return master.getMasterFileSystem();<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>  public boolean isRunning() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (this.master == null || this.master.getMasterProcedureExecutor() == null) return false;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    return master.getMasterProcedureExecutor().isRunning();<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>  public MasterProcedureScheduler getProcedureScheduler() {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return procSched;<a name="line.132"></a>
+<span class="sourceLineNo">131</span>  public boolean isInitialized() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    return master.isInitialized();<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>  public RSProcedureDispatcher getRemoteDispatcher() {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    return remoteDispatcher;<a name="line.136"></a>
+<span class="sourceLineNo">135</span>  public boolean waitInitialized(Procedure&lt;?&gt; proc) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    return master.getInitializedEvent().suspendIfNotReady(proc);<a name="line.136"></a>
 <span class="sourceLineNo">137</span>  }<a name="line.137"></a>
 <span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return master.getReplicationPeerManager();<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>  public MasterFileSystem getMasterFileSystem() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return master.getMasterFileSystem();<a name="line.144"></a>
+<span class="sourceLineNo">139</span>  public void setEventReady(ProcedureEvent&lt;?&gt; event, boolean isReady) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (isReady) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      event.wake(procSched);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    } else {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      event.suspend();<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><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public boolean isRunning() {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (this.master == null || this.master.getMasterProcedureExecutor() == null) return false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return master.getMasterProcedureExecutor().isRunning();<a name="line.149"></a>
+<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  public void onConfigurationChange(Configuration conf) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    master.getMasterProcedureExecutor().refreshConfiguration(conf);<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>  public boolean isInitialized() {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return master.isInitialized();<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>  public boolean waitInitialized(Procedure&lt;?&gt; proc) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return master.getInitializedEvent().suspendIfNotReady(proc);<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 setEventReady(ProcedureEvent&lt;?&gt; event, boolean isReady) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    if (isReady) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      event.wake(procSched);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      event.suspend();<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><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public void onConfigurationChange(Configuration conf) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    master.getMasterProcedureExecutor().refreshConfiguration(conf);<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">151</span>}<a name="line.151"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
index 810ec00..acd402d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html
@@ -39,145 +39,124 @@
 <span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.master.replication.ReplicationPeerManager;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.procedure2.ProcedureEvent;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.security.User;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.CancelableProgressable;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.util.FSUtils;<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.apache.yetus.audience.InterfaceStability;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.slf4j.Logger;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.slf4j.LoggerFactory;<a name="line.43"></a>
-<span class="sourceLineNo">044</span><a name="line.44"></a>
-<span class="sourceLineNo">045</span>@InterfaceAudience.Private<a name="line.45"></a>
-<span class="sourceLineNo">046</span>@InterfaceStability.Evolving<a name="line.46"></a>
-<span class="sourceLineNo">047</span>public class MasterProcedureEnv implements ConfigurationObserver {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureEnv.class);<a name="line.48"></a>
-<span class="sourceLineNo">049</span><a name="line.49"></a>
-<span class="sourceLineNo">050</span>  @InterfaceAudience.Private<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  public static class WALStoreLeaseRecovery implements WALProcedureStore.LeaseRecovery {<a name="line.51"></a>
-<span class="sourceLineNo">052</span>    private final MasterServices master;<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public WALStoreLeaseRecovery(final MasterServices master) {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      this.master = master;<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>    public void recoverFileLease(final FileSystem fs, final Path path) throws IOException {<a name="line.59"></a>
-<span class="sourceLineNo">060</span>      final Configuration conf = master.getConfiguration();<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      final FSUtils fsUtils = FSUtils.getInstance(fs, conf);<a name="line.61"></a>
-<span class="sourceLineNo">062</span>      fsUtils.recoverFileLease(fs, path, conf, new CancelableProgressable() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>        @Override<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        public boolean progress() {<a name="line.64"></a>
-<span class="sourceLineNo">065</span>          LOG.debug("Recover Procedure Store log lease: " + path);<a name="line.65"></a>
-<span class="sourceLineNo">066</span>          return isRunning();<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>    }<a name="line.69"></a>
-<span class="sourceLineNo">070</span><a name="line.70"></a>
-<span class="sourceLineNo">071</span>    private boolean isRunning() {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>      return !master.isStopped() &amp;&amp; !master.isStopping() &amp;&amp; !master.isAborted();<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><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @InterfaceAudience.Private<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  public static class MasterProcedureStoreListener<a name="line.77"></a>
-<span class="sourceLineNo">078</span>      implements ProcedureStore.ProcedureStoreListener {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    private final MasterServices master;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>    public MasterProcedureStoreListener(final MasterServices master) {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>      this.master = master;<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>    public void postSync() {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>      // no-op<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    }<a name="line.88"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.security.Superusers;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.security.User;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.util.CancelableProgressable;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.util.FSUtils;<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.apache.yetus.audience.InterfaceStability;<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>@InterfaceAudience.Private<a name="line.44"></a>
+<span class="sourceLineNo">045</span>@InterfaceStability.Evolving<a name="line.45"></a>
+<span class="sourceLineNo">046</span>public class MasterProcedureEnv implements ConfigurationObserver {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  private static final Logger LOG = LoggerFactory.getLogger(MasterProcedureEnv.class);<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 static class WALStoreLeaseRecovery implements WALProcedureStore.LeaseRecovery {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    private final MasterServices master;<a name="line.51"></a>
+<span class="sourceLineNo">052</span><a name="line.52"></a>
+<span class="sourceLineNo">053</span>    public WALStoreLeaseRecovery(final MasterServices master) {<a name="line.53"></a>
+<span class="sourceLineNo">054</span>      this.master = master;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    }<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 void recoverFileLease(final FileSystem fs, final Path path) throws IOException {<a name="line.58"></a>
+<span class="sourceLineNo">059</span>      final Configuration conf = master.getConfiguration();<a name="line.59"></a>
+<span class="sourceLineNo">060</span>      final FSUtils fsUtils = FSUtils.getInstance(fs, conf);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>      fsUtils.recoverFileLease(fs, path, conf, new CancelableProgressable() {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>        @Override<a name="line.62"></a>
+<span class="sourceLineNo">063</span>        public boolean progress() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>          LOG.debug("Recover Procedure Store log lease: " + path);<a name="line.64"></a>
+<span class="sourceLineNo">065</span>          return isRunning();<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>    }<a name="line.68"></a>
+<span class="sourceLineNo">069</span><a name="line.69"></a>
+<span class="sourceLineNo">070</span>    private boolean isRunning() {<a name="line.70"></a>
+<span class="sourceLineNo">071</span>      return !master.isStopped() &amp;&amp; !master.isStopping() &amp;&amp; !master.isAborted();<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><a name="line.74"></a>
+<span class="sourceLineNo">075</span>  private final RSProcedureDispatcher remoteDispatcher;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>  private final MasterProcedureScheduler procSched;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private final MasterServices master;<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  public MasterProcedureEnv(final MasterServices master) {<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    this(master, new RSProcedureDispatcher(master));<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>  public MasterProcedureEnv(final MasterServices master,<a name="line.83"></a>
+<span class="sourceLineNo">084</span>      final RSProcedureDispatcher remoteDispatcher) {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    this.master = master;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    this.procSched = new MasterProcedureScheduler();<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    this.remoteDispatcher = remoteDispatcher;<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 abortProcess() {<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      master.abort("The Procedure Store lost the lease", null);<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>  private final RSProcedureDispatcher remoteDispatcher;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private final MasterProcedureScheduler procSched;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  private final MasterServices master;<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  public MasterProcedureEnv(final MasterServices master) {<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    this(master, new RSProcedureDispatcher(master));<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>  public MasterProcedureEnv(final MasterServices master,<a name="line.104"></a>
-<span class="sourceLineNo">105</span>      final RSProcedureDispatcher remoteDispatcher) {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    this.master = master;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    this.procSched = new MasterProcedureScheduler();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    this.remoteDispatcher = remoteDispatcher;<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>  public User getRequestUser() {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    return RpcServer.getRequestUser().orElse(Superusers.getSystemUser());<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>  public MasterServices getMasterServices() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    return master;<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>  public Configuration getMasterConfiguration() {<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return master.getConfiguration();<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public AssignmentManager getAssignmentManager() {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    return master.getAssignmentManager();<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public MasterCoprocessorHost getMasterCoprocessorHost() {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    return master.getMasterCoprocessorHost();<a name="line.128"></a>
+<span class="sourceLineNo">090</span>  public User getRequestUser() {<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    return RpcServer.getRequestUser().orElse(Superusers.getSystemUser());<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
+<span class="sourceLineNo">093</span><a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public MasterServices getMasterServices() {<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    return master;<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>  public Configuration getMasterConfiguration() {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    return master.getConfiguration();<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>  public AssignmentManager getAssignmentManager() {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    return master.getAssignmentManager();<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>  public MasterCoprocessorHost getMasterCoprocessorHost() {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    return master.getMasterCoprocessorHost();<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>  public MasterProcedureScheduler getProcedureScheduler() {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    return procSched;<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>  public RSProcedureDispatcher getRemoteDispatcher() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    return remoteDispatcher;<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>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    return master.getReplicationPeerManager();<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>  public MasterFileSystem getMasterFileSystem() {<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    return master.getMasterFileSystem();<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>  public boolean isRunning() {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    if (this.master == null || this.master.getMasterProcedureExecutor() == null) return false;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    return master.getMasterProcedureExecutor().isRunning();<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>  public MasterProcedureScheduler getProcedureScheduler() {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    return procSched;<a name="line.132"></a>
+<span class="sourceLineNo">131</span>  public boolean isInitialized() {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    return master.isInitialized();<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>  public RSProcedureDispatcher getRemoteDispatcher() {<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    return remoteDispatcher;<a name="line.136"></a>
+<span class="sourceLineNo">135</span>  public boolean waitInitialized(Procedure&lt;?&gt; proc) {<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    return master.getInitializedEvent().suspendIfNotReady(proc);<a name="line.136"></a>
 <span class="sourceLineNo">137</span>  }<a name="line.137"></a>
 <span class="sourceLineNo">138</span><a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public ReplicationPeerManager getReplicationPeerManager() {<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    return master.getReplicationPeerManager();<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>  public MasterFileSystem getMasterFileSystem() {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    return master.getMasterFileSystem();<a name="line.144"></a>
+<span class="sourceLineNo">139</span>  public void setEventReady(ProcedureEvent&lt;?&gt; event, boolean isReady) {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (isReady) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      event.wake(procSched);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    } else {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      event.suspend();<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><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  public boolean isRunning() {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    if (this.master == null || this.master.getMasterProcedureExecutor() == null) return false;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return master.getMasterProcedureExecutor().isRunning();<a name="line.149"></a>
+<span class="sourceLineNo">147</span>  @Override<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  public void onConfigurationChange(Configuration conf) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    master.getMasterProcedureExecutor().refreshConfiguration(conf);<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>  public boolean isInitialized() {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return master.isInitialized();<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>  public boolean waitInitialized(Procedure&lt;?&gt; proc) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return master.getInitializedEvent().suspendIfNotReady(proc);<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 setEventReady(ProcedureEvent&lt;?&gt; event, boolean isReady) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    if (isReady) {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      event.wake(procSched);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    } else {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      event.suspend();<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><a name="line.167"></a>
-<span class="sourceLineNo">168</span>  @Override<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  public void onConfigurationChange(Configuration conf) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    master.getMasterProcedureExecutor().refreshConfiguration(conf);<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">151</span>}<a name="line.151"></a>
 
 
 


[41/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
index 82139d6..d99f59e 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
@@ -119,7 +119,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.106">WALProcedureStore</a>
+public class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.110">WALProcedureStore</a>
 extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreBase</a></pre>
 <div class="block">WAL implementation of the ProcedureStore.
  <p/>
@@ -157,7 +157,10 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
  with the tracker of every newer wal files, using the
  <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeletedIfModifiedInBoth-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-"><code>ProcedureStoreTracker.setDeletedIfModifiedInBoth(ProcedureStoreTracker)</code></a>. If we find out
  that all the modified procedures for the oldest wal file are modified or deleted in newer wal
- files, then we can delete it.</div>
+ files, then we can delete it. This is because that, every time we call
+ <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure:A-"><code>ProcedureStore.insert(Procedure[])</code></a> or <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#update-org.apache.hadoop.hbase.procedure2.Procedure-"><code>ProcedureStore.update(Procedure)</code></a>, we will
+ persist the full state of a Procedure, so the earlier wal records for this procedure can all be
+ deleted.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPrettyPrinter.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><code>for printing content of a single WAL.</code></a>, 
@@ -668,7 +671,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#periodicRoll--">periodicRoll</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i30" class="altColor">
-<td class="colFirst"><code>protected void</code></td>
+<td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#periodicRollForTesting--">periodicRollForTesting</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i31" class="rowColor">
@@ -699,7 +702,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeInactiveLogs--">removeInactiveLogs</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i36" class="altColor">
-<td class="colFirst"><code>protected void</code></td>
+<td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#removeInactiveLogsForTesting--">removeInactiveLogsForTesting</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i37" class="rowColor">
@@ -716,7 +719,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriter-long-">rollWriter</a></span>(long&nbsp;logId)</code>&nbsp;</td>
 </tr>
 <tr id="i40" class="altColor">
-<td class="colFirst"><code>protected boolean</code></td>
+<td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#rollWriterForTesting--">rollWriterForTesting</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i41" class="rowColor">
@@ -791,7 +794,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.store.<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreBase</a></h3>
-<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#isRunning--">isRunning</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#registerListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">registerListener</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendAbortProcessSignal--">sendAbortProcessSignal</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#setRunning-boolean-">setRunning</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#unregisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">unregisterListener</a></code></li>
+<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#isRunning--">isRunning</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#registerListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">registerListener</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendAbortProcessSignal--">sendAbortProcessSignal</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendForceUpdateSignal-long:A-">sendForceUpdateSignal</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#setRunning-boolean-">setRunning</a>, <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/Procedu
 reStoreBase.html#unregisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">unregisterListener</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -820,7 +823,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <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/procedure2/store/wal/WALProcedureStore.html#line.107">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.111">LOG</a></pre>
 </li>
 </ul>
 <a name="LOG_PREFIX">
@@ -829,7 +832,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>LOG_PREFIX</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/store/wal/WALProcedureStore.html#line.108">LOG_PREFIX</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.112">LOG_PREFIX</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.LOG_PREFIX">Constant Field Values</a></dd>
@@ -842,7 +845,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>MASTER_PROCEDURE_LOGDIR</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/store/wal/WALProcedureStore.html#line.110">MASTER_PROCEDURE_LOGDIR</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.114">MASTER_PROCEDURE_LOGDIR</a></pre>
 <div class="block">Used to construct the name of the log directory for master procedures</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -856,7 +859,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>WAL_COUNT_WARN_THRESHOLD_CONF_KEY</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/store/wal/WALProcedureStore.html#line.117">WAL_COUNT_WARN_THRESHOLD_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.121">WAL_COUNT_WARN_THRESHOLD_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.WAL_COUNT_WARN_THRESHOLD_CONF_KEY">Constant Field Values</a></dd>
@@ -869,7 +872,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WAL_COUNT_WARN_THRESHOLD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.119">DEFAULT_WAL_COUNT_WARN_THRESHOLD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.123">DEFAULT_WAL_COUNT_WARN_THRESHOLD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_WAL_COUNT_WARN_THRESHOLD">Constant Field Values</a></dd>
@@ -882,7 +885,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</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/store/wal/WALProcedureStore.html#line.121">EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.125">EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY">Constant Field Values</a></dd>
@@ -895,7 +898,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</h4>
-<pre>private static final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.123">DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</a></pre>
+<pre>private static final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.127">DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY">Constant Field Values</a></dd>
@@ -908,7 +911,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_RETRIES_BEFORE_ROLL_CONF_KEY</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/store/wal/WALProcedureStore.html#line.125">MAX_RETRIES_BEFORE_ROLL_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.129">MAX_RETRIES_BEFORE_ROLL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.MAX_RETRIES_BEFORE_ROLL_CONF_KEY">Constant Field Values</a></dd>
@@ -921,7 +924,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_RETRIES_BEFORE_ROLL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.127">DEFAULT_MAX_RETRIES_BEFORE_ROLL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.131">DEFAULT_MAX_RETRIES_BEFORE_ROLL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_MAX_RETRIES_BEFORE_ROLL">Constant Field Values</a></dd>
@@ -934,7 +937,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>WAIT_BEFORE_ROLL_CONF_KEY</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/store/wal/WALProcedureStore.html#line.129">WAIT_BEFORE_ROLL_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.133">WAIT_BEFORE_ROLL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.WAIT_BEFORE_ROLL_CONF_KEY">Constant Field Values</a></dd>
@@ -947,7 +950,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WAIT_BEFORE_ROLL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.131">DEFAULT_WAIT_BEFORE_ROLL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.135">DEFAULT_WAIT_BEFORE_ROLL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_WAIT_BEFORE_ROLL">Constant Field Values</a></dd>
@@ -960,7 +963,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>ROLL_RETRIES_CONF_KEY</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/store/wal/WALProcedureStore.html#line.133">ROLL_RETRIES_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.137">ROLL_RETRIES_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.ROLL_RETRIES_CONF_KEY">Constant Field Values</a></dd>
@@ -973,7 +976,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROLL_RETRIES</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.135">DEFAULT_ROLL_RETRIES</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.139">DEFAULT_ROLL_RETRIES</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_ROLL_RETRIES">Constant Field Values</a></dd>
@@ -986,7 +989,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_SYNC_FAILURE_ROLL_CONF_KEY</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/store/wal/WALProcedureStore.html#line.137">MAX_SYNC_FAILURE_ROLL_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.141">MAX_SYNC_FAILURE_ROLL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.MAX_SYNC_FAILURE_ROLL_CONF_KEY">Constant Field Values</a></dd>
@@ -999,7 +1002,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_MAX_SYNC_FAILURE_ROLL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.139">DEFAULT_MAX_SYNC_FAILURE_ROLL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.143">DEFAULT_MAX_SYNC_FAILURE_ROLL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_MAX_SYNC_FAILURE_ROLL">Constant Field Values</a></dd>
@@ -1012,7 +1015,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>PERIODIC_ROLL_CONF_KEY</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/store/wal/WALProcedureStore.html#line.141">PERIODIC_ROLL_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.145">PERIODIC_ROLL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.PERIODIC_ROLL_CONF_KEY">Constant Field Values</a></dd>
@@ -1025,7 +1028,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_PERIODIC_ROLL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.143">DEFAULT_PERIODIC_ROLL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.147">DEFAULT_PERIODIC_ROLL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_PERIODIC_ROLL">Constant Field Values</a></dd>
@@ -1038,7 +1041,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>SYNC_WAIT_MSEC_CONF_KEY</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/store/wal/WALProcedureStore.html#line.145">SYNC_WAIT_MSEC_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.149">SYNC_WAIT_MSEC_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.SYNC_WAIT_MSEC_CONF_KEY">Constant Field Values</a></dd>
@@ -1051,7 +1054,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SYNC_WAIT_MSEC</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.146">DEFAULT_SYNC_WAIT_MSEC</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.150">DEFAULT_SYNC_WAIT_MSEC</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_SYNC_WAIT_MSEC">Constant Field Values</a></dd>
@@ -1064,7 +1067,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>USE_HSYNC_CONF_KEY</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/store/wal/WALProcedureStore.html#line.148">USE_HSYNC_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.152">USE_HSYNC_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.USE_HSYNC_CONF_KEY">Constant Field Values</a></dd>
@@ -1077,7 +1080,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_USE_HSYNC</h4>
-<pre>private static final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.149">DEFAULT_USE_HSYNC</a></pre>
+<pre>private static final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.153">DEFAULT_USE_HSYNC</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_USE_HSYNC">Constant Field Values</a></dd>
@@ -1090,7 +1093,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>ROLL_THRESHOLD_CONF_KEY</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/store/wal/WALProcedureStore.html#line.151">ROLL_THRESHOLD_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.155">ROLL_THRESHOLD_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.ROLL_THRESHOLD_CONF_KEY">Constant Field Values</a></dd>
@@ -1103,7 +1106,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROLL_THRESHOLD</h4>
-<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.152">DEFAULT_ROLL_THRESHOLD</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.156">DEFAULT_ROLL_THRESHOLD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_ROLL_THRESHOLD">Constant Field Values</a></dd>
@@ -1116,7 +1119,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>STORE_WAL_SYNC_STATS_COUNT</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/store/wal/WALProcedureStore.html#line.154">STORE_WAL_SYNC_STATS_COUNT</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.158">STORE_WAL_SYNC_STATS_COUNT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.STORE_WAL_SYNC_STATS_COUNT">Constant Field Values</a></dd>
@@ -1129,7 +1132,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_SYNC_STATS_COUNT</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.156">DEFAULT_SYNC_STATS_COUNT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.160">DEFAULT_SYNC_STATS_COUNT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.DEFAULT_SYNC_STATS_COUNT">Constant Field Values</a></dd>
@@ -1142,7 +1145,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>logs</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html?is-external=true" title="class or interface in java.util">LinkedList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.158">logs</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html?is-external=true" title="class or interface in java.util">LinkedList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.162">logs</a></pre>
 </li>
 </ul>
 <a name="holdingCleanupTracker">
@@ -1151,7 +1154,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>holdingCleanupTracker</h4>
-<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.159">holdingCleanupTracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.163">holdingCleanupTracker</a></pre>
 </li>
 </ul>
 <a name="storeTracker">
@@ -1160,7 +1163,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>storeTracker</h4>
-<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.160">storeTracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.164">storeTracker</a></pre>
 </li>
 </ul>
 <a name="lock">
@@ -1169,7 +1172,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantLock</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.161">lock</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html?is-external=true" title="class or interface in java.util.concurrent.locks">ReentrantLock</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.165">lock</a></pre>
 </li>
 </ul>
 <a name="waitCond">
@@ -1178,7 +1181,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>waitCond</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.162">waitCond</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.166">waitCond</a></pre>
 </li>
 </ul>
 <a name="slotCond">
@@ -1187,7 +1190,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>slotCond</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.163">slotCond</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.167">slotCond</a></pre>
 </li>
 </ul>
 <a name="syncCond">
@@ -1196,7 +1199,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncCond</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.164">syncCond</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/Condition.html?is-external=true" title="class or interface in java.util.concurrent.locks">Condition</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.168">syncCond</a></pre>
 </li>
 </ul>
 <a name="leaseRecovery">
@@ -1205,7 +1208,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>leaseRecovery</h4>
-<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.166">leaseRecovery</a></pre>
+<pre>private final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.170">leaseRecovery</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -1214,7 +1217,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.167">conf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.171">conf</a></pre>
 </li>
 </ul>
 <a name="fs">
@@ -1223,7 +1226,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>fs</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.168">fs</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.FileSystem <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.172">fs</a></pre>
 </li>
 </ul>
 <a name="walDir">
@@ -1232,7 +1235,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>walDir</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.169">walDir</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.173">walDir</a></pre>
 </li>
 </ul>
 <a name="walArchiveDir">
@@ -1241,7 +1244,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>walArchiveDir</h4>
-<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.170">walArchiveDir</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.174">walArchiveDir</a></pre>
 </li>
 </ul>
 <a name="enforceStreamCapability">
@@ -1250,7 +1253,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>enforceStreamCapability</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.171">enforceStreamCapability</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.175">enforceStreamCapability</a></pre>
 </li>
 </ul>
 <a name="syncException">
@@ -1259,7 +1262,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncException</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.173">syncException</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.177">syncException</a></pre>
 </li>
 </ul>
 <a name="loading">
@@ -1268,7 +1271,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>loading</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.174">loading</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.178">loading</a></pre>
 </li>
 </ul>
 <a name="inSync">
@@ -1277,7 +1280,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>inSync</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.175">inSync</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.179">inSync</a></pre>
 </li>
 </ul>
 <a name="totalSynced">
@@ -1286,7 +1289,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>totalSynced</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.176">totalSynced</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.180">totalSynced</a></pre>
 </li>
 </ul>
 <a name="lastRollTs">
@@ -1295,7 +1298,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>lastRollTs</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.177">lastRollTs</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.181">lastRollTs</a></pre>
 </li>
 </ul>
 <a name="syncId">
@@ -1304,7 +1307,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncId</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.178">syncId</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.182">syncId</a></pre>
 </li>
 </ul>
 <a name="slotsCache">
@@ -1313,7 +1316,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>slotsCache</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/LinkedTransferQueue.html?is-external=true" title="class or interface in java.util.concurrent">LinkedTransferQueue</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.180">slotsCache</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/LinkedTransferQueue.html?is-external=true" title="class or interface in java.util.concurrent">LinkedTransferQueue</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.184">slotsCache</a></pre>
 </li>
 </ul>
 <a name="corruptedLogs">
@@ -1322,7 +1325,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>corruptedLogs</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.181">corruptedLogs</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.185">corruptedLogs</a></pre>
 </li>
 </ul>
 <a name="stream">
@@ -1331,7 +1334,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>stream</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.FSDataOutputStream <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.182">stream</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.FSDataOutputStream <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.186">stream</a></pre>
 </li>
 </ul>
 <a name="runningProcCount">
@@ -1340,7 +1343,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>runningProcCount</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.183">runningProcCount</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.187">runningProcCount</a></pre>
 </li>
 </ul>
 <a name="flushLogId">
@@ -1349,7 +1352,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>flushLogId</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.184">flushLogId</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.188">flushLogId</a></pre>
 </li>
 </ul>
 <a name="syncMaxSlot">
@@ -1358,7 +1361,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncMaxSlot</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.185">syncMaxSlot</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.189">syncMaxSlot</a></pre>
 </li>
 </ul>
 <a name="slotIndex">
@@ -1367,7 +1370,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>slotIndex</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.186">slotIndex</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.190">slotIndex</a></pre>
 </li>
 </ul>
 <a name="syncThread">
@@ -1376,7 +1379,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncThread</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.187">syncThread</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.191">syncThread</a></pre>
 </li>
 </ul>
 <a name="slots">
@@ -1385,7 +1388,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>slots</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>[] <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.188">slots</a></pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>[] <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.192">slots</a></pre>
 </li>
 </ul>
 <a name="walCountWarnThreshold">
@@ -1394,7 +1397,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>walCountWarnThreshold</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.190">walCountWarnThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.194">walCountWarnThreshold</a></pre>
 </li>
 </ul>
 <a name="maxRetriesBeforeRoll">
@@ -1403,7 +1406,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>maxRetriesBeforeRoll</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.191">maxRetriesBeforeRoll</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.195">maxRetriesBeforeRoll</a></pre>
 </li>
 </ul>
 <a name="maxSyncFailureRoll">
@@ -1412,7 +1415,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>maxSyncFailureRoll</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.192">maxSyncFailureRoll</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.196">maxSyncFailureRoll</a></pre>
 </li>
 </ul>
 <a name="waitBeforeRoll">
@@ -1421,7 +1424,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>waitBeforeRoll</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.193">waitBeforeRoll</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.197">waitBeforeRoll</a></pre>
 </li>
 </ul>
 <a name="rollRetries">
@@ -1430,7 +1433,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollRetries</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.194">rollRetries</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.198">rollRetries</a></pre>
 </li>
 </ul>
 <a name="periodicRollMsec">
@@ -1439,7 +1442,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>periodicRollMsec</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.195">periodicRollMsec</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.199">periodicRollMsec</a></pre>
 </li>
 </ul>
 <a name="rollThreshold">
@@ -1448,7 +1451,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>rollThreshold</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.196">rollThreshold</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.200">rollThreshold</a></pre>
 </li>
 </ul>
 <a name="useHsync">
@@ -1457,7 +1460,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>useHsync</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.197">useHsync</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.201">useHsync</a></pre>
 </li>
 </ul>
 <a name="syncWaitMsec">
@@ -1466,7 +1469,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncWaitMsec</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.198">syncWaitMsec</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.202">syncWaitMsec</a></pre>
 </li>
 </ul>
 <a name="syncMetricsQueue">
@@ -1475,7 +1478,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncMetricsQueue</h4>
-<pre>private&nbsp;org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.201">syncMetricsQueue</a></pre>
+<pre>private&nbsp;org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.205">syncMetricsQueue</a></pre>
 </li>
 </ul>
 <a name="WALS_PATH_FILTER">
@@ -1484,7 +1487,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>WALS_PATH_FILTER</h4>
-<pre>private static final&nbsp;org.apache.hadoop.fs.PathFilter <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1231">WALS_PATH_FILTER</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.fs.PathFilter <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1247">WALS_PATH_FILTER</a></pre>
 </li>
 </ul>
 <a name="FILE_STATUS_ID_COMPARATOR">
@@ -1493,7 +1496,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FILE_STATUS_ID_COMPARATOR</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;org.apache.hadoop.fs.FileStatus&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1239">FILE_STATUS_ID_COMPARATOR</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html?is-external=true" title="class or interface in java.util">Comparator</a>&lt;org.apache.hadoop.fs.FileStatus&gt; <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.1255">FILE_STATUS_ID_COMPARATOR</a></pre>
 </li>
 </ul>
 </li>
@@ -1510,7 +1513,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>WALProcedureStore</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.231">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.235">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a>&nbsp;leaseRecovery)
                   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>
@@ -1525,7 +1528,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALProcedureStore</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.240">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.244">WALProcedureStore</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          org.apache.hadoop.fs.Path&nbsp;walDir,
                          org.apache.hadoop.fs.Path&nbsp;walArchiveDir,
                          <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a>&nbsp;leaseRecovery)
@@ -1550,7 +1553,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.271">start</a>(int&nbsp;numSlots)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.275">start</a>(int&nbsp;numSlots)
            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 interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#start-int-">ProcedureStore</a></code></span></div>
 <div class="block">Start/Open the procedure store</div>
@@ -1566,7 +1569,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.321">stop</a>(boolean&nbsp;abort)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.325">stop</a>(boolean&nbsp;abort)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#stop-boolean-">ProcedureStore</a></code></span></div>
 <div class="block">Stop/Close the procedure store</div>
 <dl>
@@ -1581,7 +1584,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>sendStopSignal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.354">sendStopSignal</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.358">sendStopSignal</a>()</pre>
 </li>
 </ul>
 <a name="getNumThreads--">
@@ -1590,7 +1593,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumThreads</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.366">getNumThreads</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.370">getNumThreads</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of threads/slots passed to start()</dd>
@@ -1603,7 +1606,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>setRunningProcedureCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.371">setRunningProcedureCount</a>(int&nbsp;count)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.375">setRunningProcedureCount</a>(int&nbsp;count)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#setRunningProcedureCount-int-">ProcedureStore</a></code></span></div>
 <div class="block">Set the number of procedure running.
  This can be used, for example, by the store to know how long to wait before a sync.</div>
@@ -1619,7 +1622,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreTracker</h4>
-<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.376">getStoreTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.380">getStoreTracker</a>()</pre>
 </li>
 </ul>
 <a name="getActiveLogs--">
@@ -1628,7 +1631,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveLogs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.380">getActiveLogs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.384">getActiveLogs</a>()</pre>
 </li>
 </ul>
 <a name="getCorruptedLogs--">
@@ -1637,7 +1640,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getCorruptedLogs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.389">getCorruptedLogs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALFile.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALFile</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.393">getCorruptedLogs</a>()</pre>
 </li>
 </ul>
 <a name="recoverLease--">
@@ -1646,7 +1649,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>recoverLease</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.394">recoverLease</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.398">recoverLease</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#recoverLease--">ProcedureStore</a></code></span></div>
 <div class="block">Acquire the lease for the procedure store.</div>
@@ -1662,7 +1665,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.441">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.445">load</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
           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 interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#load-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureLoader-">ProcedureStore</a></code></span></div>
 <div class="block">Load the Procedures in the store.</div>
@@ -1680,7 +1683,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>tryCleanupLogsOnLoad</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.497">tryCleanupLogsOnLoad</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.501">tryCleanupLogsOnLoad</a>()</pre>
 </li>
 </ul>
 <a name="insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">
@@ -1689,7 +1692,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.516">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.522">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                    <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;subprocs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">When a procedure is submitted to the executor insert(proc, null) will be called.
@@ -1711,7 +1714,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.550">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.556">insert</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#insert-org.apache.hadoop.hbase.procedure2.Procedure:A-">ProcedureStore</a></code></span></div>
 <div class="block">Serialize a set of new procedures.
  These procedures are freshly submitted to the executor and each procedure
@@ -1728,7 +1731,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.579">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.585">update</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#update-org.apache.hadoop.hbase.procedure2.Procedure-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procedure was executed,
  and the new state should be written to the store.</div>
@@ -1744,7 +1747,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.602">delete</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.608">delete</a>(long&nbsp;procId)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long-">ProcedureStore</a></code></span></div>
 <div class="block">The specified procId was removed from the executor,
  due to completion, abort or failure.
@@ -1761,7 +1764,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.622">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.628">delete</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
                    long[]&nbsp;subProcIds)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-org.apache.hadoop.hbase.procedure2.Procedure-long:A-">ProcedureStore</a></code></span></div>
 <div class="block">The parent procedure completed.
@@ -1779,7 +1782,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.647">delete</a>(long[]&nbsp;procIds,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.653">delete</a>(long[]&nbsp;procIds,
                    int&nbsp;offset,
                    int&nbsp;count)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#delete-long:A-int-int-">ProcedureStore</a></code></span></div>
@@ -1800,7 +1803,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.658">delete</a>(long[]&nbsp;procIds)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.664">delete</a>(long[]&nbsp;procIds)</pre>
 </li>
 </ul>
 <a name="acquireSlot--">
@@ -1809,7 +1812,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>acquireSlot</h4>
-<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.682">acquireSlot</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.688">acquireSlot</a>()</pre>
 </li>
 </ul>
 <a name="releaseSlot-org.apache.hadoop.hbase.procedure2.util.ByteSlot-">
@@ -1818,7 +1821,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseSlot</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.687">releaseSlot</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.693">releaseSlot</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot)</pre>
 </li>
 </ul>
 <a name="pushData-org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.PushType-org.apache.hadoop.hbase.procedure2.util.ByteSlot-long-long:A-">
@@ -1827,7 +1830,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>pushData</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.694">pushData</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.700">pushData</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
                       <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/util/ByteSlot.html" title="class in org.apache.hadoop.hbase.procedure2.util">ByteSlot</a>&nbsp;slot,
                       long&nbsp;procId,
                       long[]&nbsp;subProcIds)</pre>
@@ -1839,7 +1842,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStoreTracker</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.754">updateStoreTracker</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.760">updateStoreTracker</a>(<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;type,
                                 long&nbsp;procId,
                                 long[]&nbsp;subProcIds)</pre>
 </li>
@@ -1850,7 +1853,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>isSyncAborted</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.785">isSyncAborted</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.791">isSyncAborted</a>()</pre>
 </li>
 </ul>
 <a name="syncLoop--">
@@ -1859,7 +1862,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncLoop</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.789">syncLoop</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.795">syncLoop</a>()
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1873,7 +1876,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>getSyncMetrics</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.869">getSyncMetrics</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.SyncMetrics</a>&gt;&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.875">getSyncMetrics</a>()</pre>
 </li>
 </ul>
 <a name="syncSlots--">
@@ -1882,7 +1885,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncSlots</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.878">syncSlots</a>()
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.884">syncSlots</a>()
                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -1896,7 +1899,7 @@ extends <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>syncSlots</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.906">syncSlots</a>(org.apache.hadoop.fs.FSDataOutputStream&nbsp;stream,
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#

<TRUNCATED>

[06/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
index d69bb8c..92967f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.Providers.html
@@ -88,428 +88,404 @@
 <span class="sourceLineNo">080</span><a name="line.80"></a>
 <span class="sourceLineNo">081</span>  public static final String WAL_PROVIDER = "hbase.wal.provider";<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  static final String DEFAULT_WAL_PROVIDER = Providers.defaultProvider.name();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public static final String WAL_PROVIDER_CLASS = "hbase.wal.provider.class";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  static final Class&lt;? extends WALProvider&gt; DEFAULT_WAL_PROVIDER_CLASS = AsyncFSWALProvider.class;<a name="line.84"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public static final String META_WAL_PROVIDER_CLASS = "hbase.wal.meta_provider.class";<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  final String factoryId;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private final WALProvider provider;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // The meta updates are written to a different wal. If this<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private final int timeoutMillis;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private final Configuration conf;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  // Used for the singleton WALFactory, see below.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private WALFactory(Configuration conf) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    // this code is duplicated here so we can keep our members final.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      AbstractFSWALProvider.Reader.class);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    this.conf = conf;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    // end required early initialization<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // this instance can't create wals, just reader/writers.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    provider = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  Providers getDefaultProvider() {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /*<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param clsKey config key for provider classname<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param key config key for provider enum<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param defaultValue default value for provider enum<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @return Class which extends WALProvider<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String clsKey, String key,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      String defaultValue) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String clsName = conf.get(clsKey);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (clsName == null || clsName.isEmpty()) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      clsName = conf.get(key, defaultValue);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (clsName != null &amp;&amp; !clsName.isEmpty()) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      try {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        return (Class&lt;? extends WALProvider&gt;) Class.forName(clsName);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      } catch (ClassNotFoundException exception) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        // try with enum key next<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>    try {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      // all versions.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        // easily broken when upgrading hadoop.<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        return FSHLogProvider.class;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      // not fall back to FSHLogProvider.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return provider.clazz;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    } catch (IllegalArgumentException exception) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      // Fall back to them specifying a class name<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      // when there is a config value present.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return conf.getClass(key, AsyncFSWALProvider.class, WALProvider.class);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    try {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    } catch (Exception e) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   *          instances.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *          to make a directory<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    this(conf, factoryId, true);<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>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   *          instances.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   *          to make a directory<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   *          {@link SyncReplicationWALProvider}<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      throws IOException {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      AbstractFSWALProvider.Reader.class);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    this.conf = conf;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    this.factoryId = factoryId;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // end required early initialization<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      WALProvider provider = createProvider(<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          getProviderClass(WAL_PROVIDER_CLASS, WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      if (enableSyncReplicationWALProvider) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      provider.init(this, conf, null);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      this.provider = provider;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } else {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      // special handling of existing configuration behavior.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.warn("Running with WAL disabled.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      provider = new DisabledWALProvider();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      provider.init(this, conf, factoryId);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * factory.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public void close() throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    if (null != metaProvider) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      metaProvider.close();<a name="line.244"></a>
+<span class="sourceLineNo">086</span>  final String factoryId;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final WALProvider provider;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // The meta updates are written to a different wal. If this<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private final int timeoutMillis;<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private final Configuration conf;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  // Used for the singleton WALFactory, see below.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private WALFactory(Configuration conf) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    // this code is duplicated here so we can keep our members final.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      AbstractFSWALProvider.Reader.class);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.conf = conf;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // end required early initialization<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // this instance can't create wals, just reader/writers.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    provider = null;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  @VisibleForTesting<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.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><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<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><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<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>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      provider.close();<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><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // within the getInstance method.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    if (null != provider) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      provider.close();<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>  /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public void shutdown() throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    IOException exception = null;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (null != metaProvider) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      try {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        metaProvider.shutdown();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } catch(IOException ioe) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        exception = ioe;<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>
-<span class="sourceLineNo">268</span>    provider.shutdown();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (null != exception) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throw exception;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;WAL&gt; getWALs() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return provider.getWALs();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  WALProvider getMetaProvider() throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    for (;;) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      WALProvider provider = this.metaProvider.get();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      if (provider != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        return provider;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      boolean metaWALProvPresent = conf.get(META_WAL_PROVIDER_CLASS) != null;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      provider = createProvider(getProviderClass(<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          metaWALProvPresent ? META_WAL_PROVIDER_CLASS : WAL_PROVIDER_CLASS,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return provider;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        // someone is ahead of us, close and try again.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        provider.close();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // use different WAL for hbase:meta<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      return getMetaProvider().getWAL(region);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    } else {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      return provider.getWAL(region);<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><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    return createReader(fs, path, (CancelableProgressable)null);<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">317</span>  /**<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * then just seek back to the last known good position.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return A WAL reader.  Close when done with it.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      CancelableProgressable reporter) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return createReader(fs, path, reporter, true);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      boolean allowCustom) throws IOException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      // A wal file could be under recovery, so it may take several<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // to open it up to 5 minutes by default.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      int nbAttempt = 0;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      while (true) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          reader.init(fs, path, conf, null);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          return reader;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        } catch (IOException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          if (reader != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            try {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              reader.close();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>            } catch (IOException exception) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              LOG.debug("exception details", exception);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>            }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          }<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>          String msg = e.getMessage();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (msg != null<a name="line.357"></a>
-<span class="sourceLineNo">358</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>            if (++nbAttempt == 1) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.368"></a>
-<span class="sourceLineNo">369</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>            } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>              try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                continue; // retry<a name="line.373"></a>
-<span class="sourceLineNo">374</span>              } catch (InterruptedException ie) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                iioe.initCause(ie);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                throw iioe;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>            throw new LeaseNotRecoveredException(e);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          } else {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            throw e;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    } catch (IOException ie) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      throw ie;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    } catch (Exception e) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      throw new IOException("Cannot get log reader", e);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  }<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>   * Create a writer for the WAL.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Uses defaults.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * &lt;p&gt;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * Should be package-private. public only for tests and<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * @return A WAL writer. Close when done with it.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   */<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return FSHLogProvider.createWriter(conf, fs, path, 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>   * Should be package-private, visible for recovery testing.<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   * Uses defaults.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  @VisibleForTesting<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  // These static methods are currently used where it's impractical to<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // WALFactory that just provides Reader / Writers.<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  <a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // Public only for FSHLog<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    WALFactory factory = singleton.get();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (null == factory) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      WALFactory temp = new WALFactory(configuration);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        factory = temp;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } else {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // someone else beat us to initializing<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        try {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          temp.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        } catch (IOException exception) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        factory = singleton.get();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return factory;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @return a WAL Reader, caller must close.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      final Configuration configuration) throws IOException {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return getInstance(configuration).createReader(fs, path);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return a WAL Reader, caller must close.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * @return a WAL Reader, caller must close.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      final Configuration configuration) throws IOException {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  /**<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * Uses defaults.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   */<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      final Configuration configuration)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      throws IOException {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Uses defaults.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  @VisibleForTesting<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      final Configuration configuration)<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      throws IOException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public final WALProvider getWALProvider() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return this.provider;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  public final WALProvider getMetaWALProvider() {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    return this.metaProvider.get();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>}<a name="line.504"></a>
+<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw exception;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return provider;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        provider.close();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return provider.getWAL(region);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>          String msg = e.getMessage();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
+<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                throw iioe;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            throw e;<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>    } catch (IOException ie) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * Create a writer for the WAL.<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  /**<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  <a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        factory = singleton.get();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return factory;<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>  /**<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>}<a name="line.480"></a>
 
 
 


[22/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
index 8dc2d73..ecd1970 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
@@ -25,384 +25,407 @@
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
 <span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.procedure2.store;<a name="line.18"></a>
 <span class="sourceLineNo">019</span><a name="line.19"></a>
-<span class="sourceLineNo">020</span>import java.util.Arrays;<a name="line.20"></a>
-<span class="sourceLineNo">021</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.DeleteState;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.22"></a>
-<span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.24"></a>
+<span class="sourceLineNo">020</span>import java.util.ArrayList;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.util.Arrays;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.List;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.DeleteState;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
 <span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
-<span class="sourceLineNo">027</span> * A bitmap which can grow/merge with other {@link BitSetNode} (if certain conditions are met).<a name="line.27"></a>
-<span class="sourceLineNo">028</span> * Boundaries of bitmap are aligned to multiples of {@link BitSetNode#BITS_PER_WORD}. So the range<a name="line.28"></a>
-<span class="sourceLineNo">029</span> * of a {@link BitSetNode} is from [x * K, y * K) where x and y are integers, y &gt; x and K is<a name="line.29"></a>
-<span class="sourceLineNo">030</span> * BITS_PER_WORD.<a name="line.30"></a>
-<span class="sourceLineNo">031</span> * &lt;p/&gt;<a name="line.31"></a>
-<span class="sourceLineNo">032</span> * We have two main bit sets to describe the state of procedures, the meanings are:<a name="line.32"></a>
-<span class="sourceLineNo">033</span> *<a name="line.33"></a>
-<span class="sourceLineNo">034</span> * &lt;pre&gt;<a name="line.34"></a>
-<span class="sourceLineNo">035</span> *  ----------------------<a name="line.35"></a>
-<span class="sourceLineNo">036</span> * | modified | deleted |  meaning<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * |     0    |   0     |  proc exists, but hasn't been updated since last resetUpdates().<a name="line.37"></a>
-<span class="sourceLineNo">038</span> * |     1    |   0     |  proc was updated (but not deleted).<a name="line.38"></a>
-<span class="sourceLineNo">039</span> * |     1    |   1     |  proc was deleted.<a name="line.39"></a>
-<span class="sourceLineNo">040</span> * |     0    |   1     |  proc doesn't exist (maybe never created, maybe deleted in past).<a name="line.40"></a>
-<span class="sourceLineNo">041</span> * ----------------------<a name="line.41"></a>
-<span class="sourceLineNo">042</span> * &lt;/pre&gt;<a name="line.42"></a>
-<span class="sourceLineNo">043</span> *<a name="line.43"></a>
-<span class="sourceLineNo">044</span> * The meaning of modified is that, we have modified the state of the procedure, no matter insert,<a name="line.44"></a>
-<span class="sourceLineNo">045</span> * update, or delete. And if it is an insert or update, we will set the deleted to 0, if not we will<a name="line.45"></a>
-<span class="sourceLineNo">046</span> * set the delete to 1.<a name="line.46"></a>
-<span class="sourceLineNo">047</span> * &lt;p/&gt;<a name="line.47"></a>
-<span class="sourceLineNo">048</span> * For a non-partial BitSetNode, the initial modified value is 0 and deleted value is 1. For the<a name="line.48"></a>
-<span class="sourceLineNo">049</span> * partial one, the initial modified value is 0 and the initial deleted value is also 0. In<a name="line.49"></a>
-<span class="sourceLineNo">050</span> * {@link #unsetPartialFlag()} we will reset the deleted to 1 if it is not modified.<a name="line.50"></a>
-<span class="sourceLineNo">051</span> */<a name="line.51"></a>
-<span class="sourceLineNo">052</span>@InterfaceAudience.Private<a name="line.52"></a>
-<span class="sourceLineNo">053</span>class BitSetNode {<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private static final long WORD_MASK = 0xffffffffffffffffL;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private static final int ADDRESS_BITS_PER_WORD = 6;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private static final int BITS_PER_WORD = 1 &lt;&lt; ADDRESS_BITS_PER_WORD;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  private static final int MAX_NODE_SIZE = 1 &lt;&lt; ADDRESS_BITS_PER_WORD;<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>   * Mimics {@link ProcedureStoreTracker#partial}. It will effect how we fill the new deleted bits<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * when growing.<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
-<span class="sourceLineNo">063</span>  private boolean partial;<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>   * Set of procedures which have been modified since last {@link #resetModified()}. Useful to track<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   * procedures which have been modified since last WAL write.<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  private long[] modified;<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>   * Keeps track of procedure ids which belong to this bitmap's range and have been deleted. This<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * represents global state since it's not reset on WAL rolls.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>  private long[] deleted;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  /**<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * Offset of bitmap i.e. procedure id corresponding to first bit.<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  private long start;<a name="line.79"></a>
-<span class="sourceLineNo">080</span><a name="line.80"></a>
-<span class="sourceLineNo">081</span>  public void dump() {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    System.out.printf("%06d:%06d min=%d max=%d%n", getStart(), getEnd(), getActiveMinProcId(),<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      getActiveMaxProcId());<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    System.out.println("Modified:");<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>        System.out.print((modified[i] &amp; (1L &lt;&lt; j)) != 0 ? "1" : "0");<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      }<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      System.out.println(" " + i);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    }<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    System.out.println();<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    System.out.println("Delete:");<a name="line.92"></a>
-<span class="sourceLineNo">093</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>        System.out.print((deleted[i] &amp; (1L &lt;&lt; j)) != 0 ? "1" : "0");<a name="line.95"></a>
-<span class="sourceLineNo">096</span>      }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      System.out.println(" " + i);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    }<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    System.out.println();<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>  public BitSetNode(long procId, boolean partial) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    start = alignDown(procId);<a name="line.103"></a>
-<span class="sourceLineNo">104</span><a name="line.104"></a>
-<span class="sourceLineNo">105</span>    int count = 1;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    modified = new long[count];<a name="line.106"></a>
-<span class="sourceLineNo">107</span>    deleted = new long[count];<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    if (!partial) {<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      Arrays.fill(deleted, WORD_MASK);<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>    this.partial = partial;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    updateState(procId, false);<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>  public BitSetNode(ProcedureProtos.ProcedureStoreTracker.TrackerNode data) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    start = data.getStartId();<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    int size = data.getUpdatedCount();<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    assert size == data.getDeletedCount();<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    modified = new long[size];<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    deleted = new long[size];<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      modified[i] = data.getUpdated(i);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>      deleted[i] = data.getDeleted(i);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    }<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    partial = false;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public BitSetNode(BitSetNode other, boolean resetDelete) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    this.start = other.start;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    this.partial = other.partial;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    this.modified = other.modified.clone();<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // The resetDelete will be set to true when building cleanup tracker.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    // The intention here is that, if a procedure is not modified in this tracker, then we do not<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    // need to take care of it, so we will set deleted to true for these bits, i.e, if modified is<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    // 0, then we set deleted to 1, otherwise keep it as is. So here, the equation is<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    // deleted |= ~modified, i.e,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    if (resetDelete) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      this.deleted = new long[other.deleted.length];<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      for (int i = 0; i &lt; this.deleted.length; ++i) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        this.deleted[i] |= ~(other.modified[i]);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    } else {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      this.deleted = other.deleted.clone();<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>  public void insertOrUpdate(final long procId) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    updateState(procId, false);<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>  public void delete(final long procId) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    updateState(procId, true);<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>  public long getStart() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return start;<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 long getEnd() {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    return start + (modified.length &lt;&lt; ADDRESS_BITS_PER_WORD) - 1;<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>  public boolean contains(final long procId) {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    return start &lt;= procId &amp;&amp; procId &lt;= getEnd();<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>  public DeleteState isDeleted(final long procId) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    if (wordIndex &gt;= deleted.length) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return DeleteState.MAYBE;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    }<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return (deleted[wordIndex] &amp; (1L &lt;&lt; bitmapIndex)) != 0 ? DeleteState.YES : DeleteState.NO;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  public boolean isModified(long procId) {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    if (wordIndex &gt;= modified.length) {<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      return false;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    return (modified[wordIndex] &amp; (1L &lt;&lt; bitmapIndex)) != 0;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
-<span class="sourceLineNo">185</span><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  /**<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * @return true, if all the procedures has been modified.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public boolean isAllModified() {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    // TODO: cache the value<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if ((modified[i] | deleted[i]) != WORD_MASK) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        return false;<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>    return true;<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>   * @return true, if there are no active procedures in this BitSetNode, else false.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public boolean isEmpty() {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    // TODO: cache the value<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      if (deleted[i] != WORD_MASK) {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>        return false;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      }<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    return true;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public void resetModified() {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    Arrays.fill(modified, 0);<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>  public void unsetPartialFlag() {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    partial = false;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        if ((modified[i] &amp; (1L &lt;&lt; j)) == 0) {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          deleted[i] |= (1L &lt;&lt; j);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        }<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
-<span class="sourceLineNo">226</span><a name="line.226"></a>
-<span class="sourceLineNo">227</span>  /**<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * Convert to<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * protobuf.<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  public ProcedureProtos.ProcedureStoreTracker.TrackerNode convert() {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    ProcedureProtos.ProcedureStoreTracker.TrackerNode.Builder builder =<a name="line.233"></a>
-<span class="sourceLineNo">234</span>      ProcedureProtos.ProcedureStoreTracker.TrackerNode.newBuilder();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    builder.setStartId(start);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      builder.addUpdated(modified[i]);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      builder.addDeleted(deleted[i]);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    return builder.build();<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>  // ========================================================================<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  // Grow/Merge Helpers<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  // ========================================================================<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  public boolean canGrow(final long procId) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    return Math.abs(procId - start) &lt; MAX_NODE_SIZE;<a name="line.247"></a>
+<span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.26"></a>
+<span class="sourceLineNo">027</span><a name="line.27"></a>
+<span class="sourceLineNo">028</span>/**<a name="line.28"></a>
+<span class="sourceLineNo">029</span> * A bitmap which can grow/merge with other {@link BitSetNode} (if certain conditions are met).<a name="line.29"></a>
+<span class="sourceLineNo">030</span> * Boundaries of bitmap are aligned to multiples of {@link BitSetNode#BITS_PER_WORD}. So the range<a name="line.30"></a>
+<span class="sourceLineNo">031</span> * of a {@link BitSetNode} is from [x * K, y * K) where x and y are integers, y &gt; x and K is<a name="line.31"></a>
+<span class="sourceLineNo">032</span> * BITS_PER_WORD.<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * &lt;p/&gt;<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * We have two main bit sets to describe the state of procedures, the meanings are:<a name="line.34"></a>
+<span class="sourceLineNo">035</span> *<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * &lt;pre&gt;<a name="line.36"></a>
+<span class="sourceLineNo">037</span> *  ----------------------<a name="line.37"></a>
+<span class="sourceLineNo">038</span> * | modified | deleted |  meaning<a name="line.38"></a>
+<span class="sourceLineNo">039</span> * |     0    |   0     |  proc exists, but hasn't been updated since last resetUpdates().<a name="line.39"></a>
+<span class="sourceLineNo">040</span> * |     1    |   0     |  proc was updated (but not deleted).<a name="line.40"></a>
+<span class="sourceLineNo">041</span> * |     1    |   1     |  proc was deleted.<a name="line.41"></a>
+<span class="sourceLineNo">042</span> * |     0    |   1     |  proc doesn't exist (maybe never created, maybe deleted in past).<a name="line.42"></a>
+<span class="sourceLineNo">043</span> * ----------------------<a name="line.43"></a>
+<span class="sourceLineNo">044</span> * &lt;/pre&gt;<a name="line.44"></a>
+<span class="sourceLineNo">045</span> *<a name="line.45"></a>
+<span class="sourceLineNo">046</span> * The meaning of modified is that, we have modified the state of the procedure, no matter insert,<a name="line.46"></a>
+<span class="sourceLineNo">047</span> * update, or delete. And if it is an insert or update, we will set the deleted to 0, if not we will<a name="line.47"></a>
+<span class="sourceLineNo">048</span> * set the delete to 1.<a name="line.48"></a>
+<span class="sourceLineNo">049</span> * &lt;p/&gt;<a name="line.49"></a>
+<span class="sourceLineNo">050</span> * For a non-partial BitSetNode, the initial modified value is 0 and deleted value is 1. For the<a name="line.50"></a>
+<span class="sourceLineNo">051</span> * partial one, the initial modified value is 0 and the initial deleted value is also 0. In<a name="line.51"></a>
+<span class="sourceLineNo">052</span> * {@link #unsetPartialFlag()} we will reset the deleted to 1 if it is not modified.<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>class BitSetNode {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>  private static final long WORD_MASK = 0xffffffffffffffffL;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  private static final int ADDRESS_BITS_PER_WORD = 6;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  private static final int BITS_PER_WORD = 1 &lt;&lt; ADDRESS_BITS_PER_WORD;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private static final int MAX_NODE_SIZE = 1 &lt;&lt; ADDRESS_BITS_PER_WORD;<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>   * Mimics {@link ProcedureStoreTracker#partial}. It will effect how we fill the new deleted bits<a name="line.62"></a>
+<span class="sourceLineNo">063</span>   * when growing.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>   */<a name="line.64"></a>
+<span class="sourceLineNo">065</span>  private boolean partial;<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>   * Set of procedures which have been modified since last {@link #resetModified()}. Useful to track<a name="line.68"></a>
+<span class="sourceLineNo">069</span>   * procedures which have been modified since last WAL write.<a name="line.69"></a>
+<span class="sourceLineNo">070</span>   */<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  private long[] modified;<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>   * Keeps track of procedure ids which belong to this bitmap's range and have been deleted. This<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * represents global state since it's not reset on WAL rolls.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   */<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  private long[] deleted;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * Offset of bitmap i.e. procedure id corresponding to first bit.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private long start;<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public void dump() {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    System.out.printf("%06d:%06d min=%d max=%d%n", getStart(), getEnd(), getActiveMinProcId(),<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      getActiveMaxProcId());<a name="line.85"></a>
+<span class="sourceLineNo">086</span>    System.out.println("Modified:");<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>        System.out.print((modified[i] &amp; (1L &lt;&lt; j)) != 0 ? "1" : "0");<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      }<a name="line.90"></a>
+<span class="sourceLineNo">091</span>      System.out.println(" " + i);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    }<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    System.out.println();<a name="line.93"></a>
+<span class="sourceLineNo">094</span>    System.out.println("Delete:");<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.96"></a>
+<span class="sourceLineNo">097</span>        System.out.print((deleted[i] &amp; (1L &lt;&lt; j)) != 0 ? "1" : "0");<a name="line.97"></a>
+<span class="sourceLineNo">098</span>      }<a name="line.98"></a>
+<span class="sourceLineNo">099</span>      System.out.println(" " + i);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    }<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    System.out.println();<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>  public BitSetNode(long procId, boolean partial) {<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    start = alignDown(procId);<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>    int count = 1;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    modified = new long[count];<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    deleted = new long[count];<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    if (!partial) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      Arrays.fill(deleted, WORD_MASK);<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>    this.partial = partial;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    updateState(procId, 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>  public BitSetNode(ProcedureProtos.ProcedureStoreTracker.TrackerNode data) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    start = data.getStartId();<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    int size = data.getUpdatedCount();<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    assert size == data.getDeletedCount();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    modified = new long[size];<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    deleted = new long[size];<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    for (int i = 0; i &lt; size; ++i) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      modified[i] = data.getUpdated(i);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      deleted[i] = data.getDeleted(i);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    partial = false;<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>  public BitSetNode(BitSetNode other, boolean resetDelete) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    this.start = other.start;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    this.partial = other.partial;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    this.modified = other.modified.clone();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    // The resetDelete will be set to true when building cleanup tracker.<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // The intention here is that, if a procedure is not modified in this tracker, then we do not<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    // need to take care of it, so we will set deleted to true for these bits, i.e, if modified is<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    // 0, then we set deleted to 1, otherwise keep it as is. So here, the equation is<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    // deleted |= ~modified, i.e,<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    if (resetDelete) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      this.deleted = new long[other.deleted.length];<a name="line.141"></a>
+<span class="sourceLineNo">142</span>      for (int i = 0; i &lt; this.deleted.length; ++i) {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>        this.deleted[i] |= ~(other.modified[i]);<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      }<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    } else {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      this.deleted = other.deleted.clone();<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><a name="line.149"></a>
+<span class="sourceLineNo">150</span>  public void insertOrUpdate(final long procId) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    updateState(procId, false);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>  public void delete(final long procId) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    updateState(procId, true);<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>  public long getStart() {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    return start;<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>  public long getEnd() {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    return start + (modified.length &lt;&lt; ADDRESS_BITS_PER_WORD) - 1;<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 boolean contains(final long procId) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    return start &lt;= procId &amp;&amp; procId &lt;= getEnd();<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>  public DeleteState isDeleted(final long procId) {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    if (wordIndex &gt;= deleted.length) {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      return DeleteState.MAYBE;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    return (deleted[wordIndex] &amp; (1L &lt;&lt; bitmapIndex)) != 0 ? DeleteState.YES : DeleteState.NO;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  }<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>  public boolean isModified(long procId) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    if (wordIndex &gt;= modified.length) {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      return false;<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    return (modified[wordIndex] &amp; (1L &lt;&lt; bitmapIndex)) != 0;<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>  /**<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * @return true, if all the procedures has been modified.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   */<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  public boolean isAllModified() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    // TODO: cache the value<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      if ((modified[i] | deleted[i]) != WORD_MASK) {<a name="line.194"></a>
+<span class="sourceLineNo">195</span>        return false;<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>    return true;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  }<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  /**<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @return all the active procedure ids in this bit set.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  public long[] getActiveProcIds() {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    List&lt;Long&gt; procIds = new ArrayList&lt;&gt;();<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    for (int wordIndex = 0; wordIndex &lt; modified.length; wordIndex++) {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      if (deleted[wordIndex] == WORD_MASK || modified[wordIndex] == 0) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        // This should be the common case, where most procedures has been deleted.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        continue;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      long baseProcId = getStart() + (wordIndex &lt;&lt; ADDRESS_BITS_PER_WORD);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      for (int i = 0; i &lt; (1 &lt;&lt; ADDRESS_BITS_PER_WORD); i++) {<a name="line.212"></a>
+<span class="sourceLineNo">213</span>        long mask = 1L &lt;&lt; i;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>        if ((deleted[wordIndex] &amp; mask) == 0 &amp;&amp; (modified[wordIndex] &amp; mask) != 0) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>          procIds.add(baseProcId + i);<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>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    return procIds.stream().mapToLong(Long::longValue).toArray();<a name="line.219"></a>
+<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>  /**<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * @return true, if there are no active procedures in this BitSetNode, else false.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  public boolean isEmpty() {<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    // TODO: cache the value<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      if (deleted[i] != WORD_MASK) {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        return false;<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    }<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    return true;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public void resetModified() {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Arrays.fill(modified, 0);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  public void unsetPartialFlag() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    partial = false;<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        if ((modified[i] &amp; (1L &lt;&lt; j)) == 0) {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>          deleted[i] |= (1L &lt;&lt; j);<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    }<a name="line.247"></a>
 <span class="sourceLineNo">248</span>  }<a name="line.248"></a>
 <span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  public boolean canMerge(final BitSetNode rightNode) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    // Can just compare 'starts' since boundaries are aligned to multiples of BITS_PER_WORD.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    assert start &lt; rightNode.start;<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    return (rightNode.getEnd() - start) &lt; MAX_NODE_SIZE;<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public void grow(final long procId) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    int delta, offset;<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>    if (procId &lt; start) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      // add to head<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      long newStart = alignDown(procId);<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      delta = (int) (start - newStart) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>      offset = delta;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      start = newStart;<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    } else {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      // Add to tail<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      long newEnd = alignUp(procId + 1);<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      delta = (int) (newEnd - getEnd()) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      offset = 0;<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>    long[] newBitmap;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    int oldSize = modified.length;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    newBitmap = new long[oldSize + delta];<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    for (int i = 0; i &lt; newBitmap.length; ++i) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      newBitmap[i] = 0;<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    System.arraycopy(modified, 0, newBitmap, offset, oldSize);<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    modified = newBitmap;<a name="line.280"></a>
+<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
+<span class="sourceLineNo">251</span>   * Convert to<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   * protobuf.<a name="line.253"></a>
+<span class="sourceLineNo">254</span>   */<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  public ProcedureProtos.ProcedureStoreTracker.TrackerNode convert() {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    ProcedureProtos.ProcedureStoreTracker.TrackerNode.Builder builder =<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      ProcedureProtos.ProcedureStoreTracker.TrackerNode.newBuilder();<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    builder.setStartId(start);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    for (int i = 0; i &lt; modified.length; ++i) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      builder.addUpdated(modified[i]);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      builder.addDeleted(deleted[i]);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    return builder.build();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>  }<a name="line.264"></a>
+<span class="sourceLineNo">265</span><a name="line.265"></a>
+<span class="sourceLineNo">266</span>  // ========================================================================<a name="line.266"></a>
+<span class="sourceLineNo">267</span>  // Grow/Merge Helpers<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  // ========================================================================<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public boolean canGrow(final long procId) {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Math.abs(procId - start) &lt; MAX_NODE_SIZE;<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
+<span class="sourceLineNo">272</span><a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public boolean canMerge(final BitSetNode rightNode) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    // Can just compare 'starts' since boundaries are aligned to multiples of BITS_PER_WORD.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    assert start &lt; rightNode.start;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return (rightNode.getEnd() - start) &lt; MAX_NODE_SIZE;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public void grow(final long procId) {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    int delta, offset;<a name="line.280"></a>
 <span class="sourceLineNo">281</span><a name="line.281"></a>
-<span class="sourceLineNo">282</span>    newBitmap = new long[deleted.length + delta];<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    for (int i = 0; i &lt; newBitmap.length; ++i) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      newBitmap[i] = partial ? 0 : WORD_MASK;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    }<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    System.arraycopy(deleted, 0, newBitmap, offset, oldSize);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    deleted = newBitmap;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>  }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>  public void merge(final BitSetNode rightNode) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    int delta = (int) (rightNode.getEnd() - getEnd()) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.291"></a>
-<span class="sourceLineNo">292</span><a name="line.292"></a>
-<span class="sourceLineNo">293</span>    long[] newBitmap;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    int oldSize = modified.length;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    int newSize = (delta - rightNode.modified.length);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    int offset = oldSize + newSize;<a name="line.296"></a>
+<span class="sourceLineNo">282</span>    if (procId &lt; start) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      // add to head<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      long newStart = alignDown(procId);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      delta = (int) (start - newStart) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      offset = delta;<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      start = newStart;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    } else {<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      // Add to tail<a name="line.289"></a>
+<span class="sourceLineNo">290</span>      long newEnd = alignUp(procId + 1);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      delta = (int) (newEnd - getEnd()) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      offset = 0;<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    }<a name="line.293"></a>
+<span class="sourceLineNo">294</span><a name="line.294"></a>
+<span class="sourceLineNo">295</span>    long[] newBitmap;<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    int oldSize = modified.length;<a name="line.296"></a>
 <span class="sourceLineNo">297</span><a name="line.297"></a>
 <span class="sourceLineNo">298</span>    newBitmap = new long[oldSize + delta];<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    System.arraycopy(modified, 0, newBitmap, 0, oldSize);<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    System.arraycopy(rightNode.modified, 0, newBitmap, offset, rightNode.modified.length);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    modified = newBitmap;<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    newBitmap = new long[oldSize + delta];<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    System.arraycopy(deleted, 0, newBitmap, 0, oldSize);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    System.arraycopy(rightNode.deleted, 0, newBitmap, offset, rightNode.deleted.length);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>    deleted = newBitmap;<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>    for (int i = 0; i &lt; newSize; ++i) {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      modified[offset + i] = 0;<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      deleted[offset + i] = partial ? 0 : WORD_MASK;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    }<a name="line.311"></a>
-<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @Override<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public String toString() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    return "BitSetNode(" + getStart() + "-" + getEnd() + ")";<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  }<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>  // ========================================================================<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Min/Max Helpers<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  // ========================================================================<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  public long getActiveMinProcId() {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    long minProcId = start;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      if (deleted[i] == 0) {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>        return (minProcId);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>      if (deleted[i] != WORD_MASK) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>          if ((deleted[i] &amp; (1L &lt;&lt; j)) != 0) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>            return minProcId + j;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      }<a name="line.335"></a>
+<span class="sourceLineNo">299</span>    for (int i = 0; i &lt; newBitmap.length; ++i) {<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      newBitmap[i] = 0;<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    }<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    System.arraycopy(modified, 0, newBitmap, offset, oldSize);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>    modified = newBitmap;<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>    newBitmap = new long[deleted.length + delta];<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    for (int i = 0; i &lt; newBitmap.length; ++i) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      newBitmap[i] = partial ? 0 : WORD_MASK;<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    System.arraycopy(deleted, 0, newBitmap, offset, oldSize);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    deleted = newBitmap;<a name="line.310"></a>
+<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
+<span class="sourceLineNo">312</span><a name="line.312"></a>
+<span class="sourceLineNo">313</span>  public void merge(final BitSetNode rightNode) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    int delta = (int) (rightNode.getEnd() - getEnd()) &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>    long[] newBitmap;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    int oldSize = modified.length;<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    int newSize = (delta - rightNode.modified.length);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    int offset = oldSize + newSize;<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>    newBitmap = new long[oldSize + delta];<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    System.arraycopy(modified, 0, newBitmap, 0, oldSize);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    System.arraycopy(rightNode.modified, 0, newBitmap, offset, rightNode.modified.length);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    modified = newBitmap;<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>    newBitmap = new long[oldSize + delta];<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    System.arraycopy(deleted, 0, newBitmap, 0, oldSize);<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    System.arraycopy(rightNode.deleted, 0, newBitmap, offset, rightNode.deleted.length);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    deleted = newBitmap;<a name="line.329"></a>
+<span class="sourceLineNo">330</span><a name="line.330"></a>
+<span class="sourceLineNo">331</span>    for (int i = 0; i &lt; newSize; ++i) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      modified[offset + i] = 0;<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      deleted[offset + i] = partial ? 0 : WORD_MASK;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>  }<a name="line.335"></a>
 <span class="sourceLineNo">336</span><a name="line.336"></a>
-<span class="sourceLineNo">337</span>      minProcId += BITS_PER_WORD;<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    return minProcId;<a name="line.339"></a>
+<span class="sourceLineNo">337</span>  @Override<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public String toString() {<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    return "BitSetNode(" + getStart() + "-" + getEnd() + ")";<a name="line.339"></a>
 <span class="sourceLineNo">340</span>  }<a name="line.340"></a>
 <span class="sourceLineNo">341</span><a name="line.341"></a>
-<span class="sourceLineNo">342</span>  public long getActiveMaxProcId() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    long maxProcId = getEnd();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    for (int i = deleted.length - 1; i &gt;= 0; --i) {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      if (deleted[i] == 0) {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        return maxProcId;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>      }<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>      if (deleted[i] != WORD_MASK) {<a name="line.349"></a>
-<span class="sourceLineNo">350</span>        for (int j = BITS_PER_WORD - 1; j &gt;= 0; --j) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>          if ((deleted[i] &amp; (1L &lt;&lt; j)) == 0) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>            return maxProcId - (BITS_PER_WORD - 1 - j);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        }<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      maxProcId -= BITS_PER_WORD;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    }<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    return maxProcId;<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>  // Bitmap Helpers<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // ========================================================================<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  private int getBitmapIndex(final long procId) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return (int) (procId - start);<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  void updateState(long procId, boolean isDeleted) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    long value = (1L &lt;&lt; bitmapIndex);<a name="line.371"></a>
-<span class="sourceLineNo">372</span><a name="line.372"></a>
-<span class="sourceLineNo">373</span>    modified[wordIndex] |= value;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    if (isDeleted) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      deleted[wordIndex] |= value;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    } else {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      deleted[wordIndex] &amp;= ~value;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  // ========================================================================<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  // Helpers<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  // ========================================================================<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  /**<a name="line.384"></a>
-<span class="sourceLineNo">385</span>   * @return upper boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private static long alignUp(final long x) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    return (x + (BITS_PER_WORD - 1)) &amp; -BITS_PER_WORD;<a name="line.388"></a>
+<span class="sourceLineNo">342</span>  // ========================================================================<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  // Min/Max Helpers<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  // ========================================================================<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  public long getActiveMinProcId() {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    long minProcId = start;<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    for (int i = 0; i &lt; deleted.length; ++i) {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      if (deleted[i] == 0) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        return (minProcId);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>      }<a name="line.350"></a>
+<span class="sourceLineNo">351</span><a name="line.351"></a>
+<span class="sourceLineNo">352</span>      if (deleted[i] != WORD_MASK) {<a name="line.352"></a>
+<span class="sourceLineNo">353</span>        for (int j = 0; j &lt; BITS_PER_WORD; ++j) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>          if ((deleted[i] &amp; (1L &lt;&lt; j)) != 0) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            return minProcId + j;<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          }<a name="line.356"></a>
+<span class="sourceLineNo">357</span>        }<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      }<a name="line.358"></a>
+<span class="sourceLineNo">359</span><a name="line.359"></a>
+<span class="sourceLineNo">360</span>      minProcId += BITS_PER_WORD;<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    return minProcId;<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  }<a name="line.363"></a>
+<span class="sourceLineNo">364</span><a name="line.364"></a>
+<span class="sourceLineNo">365</span>  public long getActiveMaxProcId() {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    long maxProcId = getEnd();<a name="line.366"></a>
+<span class="sourceLineNo">367</span>    for (int i = deleted.length - 1; i &gt;= 0; --i) {<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      if (deleted[i] == 0) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        return maxProcId;<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>      if (deleted[i] != WORD_MASK) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>        for (int j = BITS_PER_WORD - 1; j &gt;= 0; --j) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>          if ((deleted[i] &amp; (1L &lt;&lt; j)) == 0) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>            return maxProcId - (BITS_PER_WORD - 1 - j);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>          }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>        }<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      }<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      maxProcId -= BITS_PER_WORD;<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    }<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    return maxProcId;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  // ========================================================================<a name="line.384"></a>
+<span class="sourceLineNo">385</span>  // Bitmap Helpers<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  // ========================================================================<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  private int getBitmapIndex(final long procId) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    return (int) (procId - start);<a name="line.388"></a>
 <span class="sourceLineNo">389</span>  }<a name="line.389"></a>
 <span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>  /**<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * @return lower boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private static long alignDown(final long x) {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    return x &amp; -BITS_PER_WORD;<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">391</span>  void updateState(long procId, boolean isDeleted) {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    int bitmapIndex = getBitmapIndex(procId);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    int wordIndex = bitmapIndex &gt;&gt; ADDRESS_BITS_PER_WORD;<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    long value = (1L &lt;&lt; bitmapIndex);<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>    modified[wordIndex] |= value;<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    if (isDeleted) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>      deleted[wordIndex] |= value;<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    } else {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      deleted[wordIndex] &amp;= ~value;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    }<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  }<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>  // Helpers<a name="line.405"></a>
+<span class="sourceLineNo">406</span>  // ========================================================================<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  /**<a name="line.407"></a>
+<span class="sourceLineNo">408</span>   * @return upper boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.<a name="line.408"></a>
+<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
+<span class="sourceLineNo">410</span>  private static long alignUp(final long x) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return (x + (BITS_PER_WORD - 1)) &amp; -BITS_PER_WORD;<a name="line.411"></a>
+<span class="sourceLineNo">412</span>  }<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>  /**<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @return lower boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private static long alignDown(final long x) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    return x &amp; -BITS_PER_WORD;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>  }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>}<a name="line.420"></a>
 
 
 


[05/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
index d69bb8c..92967f2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -88,428 +88,404 @@
 <span class="sourceLineNo">080</span><a name="line.80"></a>
 <span class="sourceLineNo">081</span>  public static final String WAL_PROVIDER = "hbase.wal.provider";<a name="line.81"></a>
 <span class="sourceLineNo">082</span>  static final String DEFAULT_WAL_PROVIDER = Providers.defaultProvider.name();<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public static final String WAL_PROVIDER_CLASS = "hbase.wal.provider.class";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  static final Class&lt;? extends WALProvider&gt; DEFAULT_WAL_PROVIDER_CLASS = AsyncFSWALProvider.class;<a name="line.84"></a>
+<span class="sourceLineNo">083</span><a name="line.83"></a>
+<span class="sourceLineNo">084</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public static final String META_WAL_PROVIDER = "hbase.wal.meta_provider";<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  public static final String META_WAL_PROVIDER_CLASS = "hbase.wal.meta_provider.class";<a name="line.87"></a>
-<span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  final String factoryId;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  private final WALProvider provider;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  // The meta updates are written to a different wal. If this<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   */<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private final int timeoutMillis;<a name="line.104"></a>
-<span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private final Configuration conf;<a name="line.106"></a>
-<span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  // Used for the singleton WALFactory, see below.<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  private WALFactory(Configuration conf) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    // this code is duplicated here so we can keep our members final.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      AbstractFSWALProvider.Reader.class);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    this.conf = conf;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    // end required early initialization<a name="line.118"></a>
-<span class="sourceLineNo">119</span><a name="line.119"></a>
-<span class="sourceLineNo">120</span>    // this instance can't create wals, just reader/writers.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    provider = null;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  Providers getDefaultProvider() {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    return Providers.defaultProvider;<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>  @VisibleForTesting<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /*<a name="line.131"></a>
-<span class="sourceLineNo">132</span>   * @param clsKey config key for provider classname<a name="line.132"></a>
-<span class="sourceLineNo">133</span>   * @param key config key for provider enum<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param defaultValue default value for provider enum<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   * @return Class which extends WALProvider<a name="line.135"></a>
-<span class="sourceLineNo">136</span>   */<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String clsKey, String key,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      String defaultValue) {<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    String clsName = conf.get(clsKey);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    if (clsName == null || clsName.isEmpty()) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>      clsName = conf.get(key, defaultValue);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    if (clsName != null &amp;&amp; !clsName.isEmpty()) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      try {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>        return (Class&lt;? extends WALProvider&gt;) Class.forName(clsName);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      } catch (ClassNotFoundException exception) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>        // try with enum key next<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>    try {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      // all versions.<a name="line.155"></a>
-<span class="sourceLineNo">156</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.156"></a>
-<span class="sourceLineNo">157</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.158"></a>
-<span class="sourceLineNo">159</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.159"></a>
-<span class="sourceLineNo">160</span>        // easily broken when upgrading hadoop.<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        return FSHLogProvider.class;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      }<a name="line.163"></a>
-<span class="sourceLineNo">164</span><a name="line.164"></a>
-<span class="sourceLineNo">165</span>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.165"></a>
-<span class="sourceLineNo">166</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      // not fall back to FSHLogProvider.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return provider.clazz;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    } catch (IllegalArgumentException exception) {<a name="line.169"></a>
-<span class="sourceLineNo">170</span>      // Fall back to them specifying a class name<a name="line.170"></a>
-<span class="sourceLineNo">171</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      // when there is a config value present.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return conf.getClass(key, AsyncFSWALProvider.class, WALProvider.class);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    try {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    } catch (Exception e) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      throw new IOException("couldn't set up WALProvider", e);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    }<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  }<a name="line.186"></a>
-<span class="sourceLineNo">187</span><a name="line.187"></a>
-<span class="sourceLineNo">188</span>  /**<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   *          instances.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *          to make a directory<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    this(conf, factoryId, true);<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>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   *          instances.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   *          to make a directory<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   *          {@link SyncReplicationWALProvider}<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   */<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      throws IOException {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      AbstractFSWALProvider.Reader.class);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    this.conf = conf;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    this.factoryId = factoryId;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    // end required early initialization<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      WALProvider provider = createProvider(<a name="line.220"></a>
-<span class="sourceLineNo">221</span>          getProviderClass(WAL_PROVIDER_CLASS, WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      if (enableSyncReplicationWALProvider) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      }<a name="line.224"></a>
-<span class="sourceLineNo">225</span>      provider.init(this, conf, null);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      this.provider = provider;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    } else {<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      // special handling of existing configuration behavior.<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      LOG.warn("Running with WAL disabled.");<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      provider = new DisabledWALProvider();<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      provider.init(this, conf, factoryId);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   * factory.<a name="line.239"></a>
-<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public void close() throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    if (null != metaProvider) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      metaProvider.close();<a name="line.244"></a>
+<span class="sourceLineNo">086</span>  final String factoryId;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  private final WALProvider provider;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  // The meta updates are written to a different wal. If this<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  // regionserver holds meta regions, then this ref will be non-null.<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  // lazily intialized; most RegionServers don't deal with META<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private final AtomicReference&lt;WALProvider&gt; metaProvider = new AtomicReference&lt;&gt;();<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>   * Configuration-specified WAL Reader used when a custom reader is requested<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  private final Class&lt;? extends AbstractFSWALProvider.Reader&gt; logReaderClass;<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>   * How long to attempt opening in-recovery wals<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  private final int timeoutMillis;<a name="line.101"></a>
+<span class="sourceLineNo">102</span><a name="line.102"></a>
+<span class="sourceLineNo">103</span>  private final Configuration conf;<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  // Used for the singleton WALFactory, see below.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  private WALFactory(Configuration conf) {<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    // this code is duplicated here so we can keep our members final.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.112"></a>
+<span class="sourceLineNo">113</span>      AbstractFSWALProvider.Reader.class);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.conf = conf;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>    // end required early initialization<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>    // this instance can't create wals, just reader/writers.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    provider = null;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    factoryId = SINGLETON_ID;<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>  @VisibleForTesting<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  Providers getDefaultProvider() {<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    return Providers.defaultProvider;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  @VisibleForTesting<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public Class&lt;? extends WALProvider&gt; getProviderClass(String key, String defaultValue) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    try {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      Providers provider = Providers.valueOf(conf.get(key, defaultValue));<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>      // AsyncFSWALProvider is not guaranteed to work on all Hadoop versions, when it's chosen as<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      // the default and we can't use it, we want to fall back to FSHLog which we know works on<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      // all versions.<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      if (provider == getDefaultProvider() &amp;&amp; provider.clazz == AsyncFSWALProvider.class<a name="line.135"></a>
+<span class="sourceLineNo">136</span>          &amp;&amp; !AsyncFSWALProvider.load()) {<a name="line.136"></a>
+<span class="sourceLineNo">137</span>        // AsyncFSWAL has better performance in most cases, and also uses less resources, we will<a name="line.137"></a>
+<span class="sourceLineNo">138</span>        // try to use it if possible. It deeply hacks into the internal of DFSClient so will be<a name="line.138"></a>
+<span class="sourceLineNo">139</span>        // easily broken when upgrading hadoop.<a name="line.139"></a>
+<span class="sourceLineNo">140</span>        LOG.warn("Failed to load AsyncFSWALProvider, falling back to FSHLogProvider");<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        return FSHLogProvider.class;<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>      // N.b. If the user specifically requested AsyncFSWALProvider but their environment doesn't<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      // support using it (e.g. AsyncFSWALProvider.load() == false), we should let this fail and<a name="line.145"></a>
+<span class="sourceLineNo">146</span>      // not fall back to FSHLogProvider.<a name="line.146"></a>
+<span class="sourceLineNo">147</span>      return provider.clazz;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    } catch (IllegalArgumentException exception) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      // Fall back to them specifying a class name<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      // Note that the passed default class shouldn't actually be used, since the above only fails<a name="line.150"></a>
+<span class="sourceLineNo">151</span>      // when there is a config value present.<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      return conf.getClass(key, Providers.defaultProvider.clazz, WALProvider.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><a name="line.155"></a>
+<span class="sourceLineNo">156</span>  static WALProvider createProvider(Class&lt;? extends WALProvider&gt; clazz) throws IOException {<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    LOG.info("Instantiating WALProvider of type {}", clazz);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    try {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      return clazz.getDeclaredConstructor().newInstance();<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    } catch (Exception e) {<a name="line.160"></a>
+<span class="sourceLineNo">161</span>      LOG.error("couldn't set up WALProvider, the configured class is " + clazz);<a name="line.161"></a>
+<span class="sourceLineNo">162</span>      LOG.debug("Exception details for failure to load WALProvider.", e);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IOException("couldn't set up WALProvider", e);<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><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   *          instances.<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   *          to make a directory<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   */<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  public WALFactory(Configuration conf, String factoryId) throws IOException {<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    // default enableSyncReplicationWALProvider is true, only disable SyncReplicationWALProvider<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    // for HMaster or HRegionServer which take system table only. See HBASE-19999<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    this(conf, factoryId, true);<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>  /**<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param conf must not be null, will keep a reference to read params in later reader/writer<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   *          instances.<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * @param factoryId a unique identifier for this factory. used i.e. by filesystem implementations<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   *          to make a directory<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * @param enableSyncReplicationWALProvider whether wrap the wal provider to a<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   *          {@link SyncReplicationWALProvider}<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   */<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public WALFactory(Configuration conf, String factoryId, boolean enableSyncReplicationWALProvider)<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      throws IOException {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    // until we've moved reader/writer construction down into providers, this initialization must<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // happen prior to provider initialization, in case they need to instantiate a reader/writer.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    timeoutMillis = conf.getInt("hbase.hlog.open.timeout", 300000);<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    /* TODO Both of these are probably specific to the fs wal provider */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    logReaderClass = conf.getClass("hbase.regionserver.hlog.reader.impl", ProtobufLogReader.class,<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      AbstractFSWALProvider.Reader.class);<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    this.conf = conf;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    this.factoryId = factoryId;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    // end required early initialization<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    if (conf.getBoolean("hbase.regionserver.hlog.enabled", true)) {<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      WALProvider provider = createProvider(getProviderClass(WAL_PROVIDER, DEFAULT_WAL_PROVIDER));<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (enableSyncReplicationWALProvider) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        provider = new SyncReplicationWALProvider(provider);<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      }<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      provider.init(this, conf, null);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      this.provider = provider;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    } else {<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      // special handling of existing configuration behavior.<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      LOG.warn("Running with WAL disabled.");<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      provider = new DisabledWALProvider();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      provider.init(this, conf, factoryId);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
+<span class="sourceLineNo">212</span>  }<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>  /**<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * Shutdown all WALs and clean up any underlying storage.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * Use only when you will not need to replay and edits that have gone to any wals from this<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * factory.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public void close() throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    if (null != metaProvider) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      metaProvider.close();<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    // within the getInstance method.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    if (null != provider) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      provider.close();<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><a name="line.230"></a>
+<span class="sourceLineNo">231</span>  /**<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
+<span class="sourceLineNo">236</span>  public void shutdown() throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    IOException exception = null;<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    if (null != metaProvider) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        metaProvider.shutdown();<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      } catch(IOException ioe) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        exception = ioe;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      }<a name="line.244"></a>
 <span class="sourceLineNo">245</span>    }<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    // close is called on a WALFactory with null provider in the case of contention handling<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    // within the getInstance method.<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    if (null != provider) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      provider.close();<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>  /**<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   * Tell the underlying WAL providers to shut down, but do not clean up underlying storage.<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * If you are not ending cleanly and will need to replay edits from this factory's wals,<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   * use this method if you can as it will try to leave things as tidy as possible.<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   */<a name="line.257"></a>
-<span class="sourceLineNo">258</span>  public void shutdown() throws IOException {<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    IOException exception = null;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>    final WALProvider metaProvider = this.metaProvider.get();<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (null != metaProvider) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      try {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        metaProvider.shutdown();<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } catch(IOException ioe) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        exception = ioe;<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>
-<span class="sourceLineNo">268</span>    provider.shutdown();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    if (null != exception) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>      throw exception;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    }<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  }<a name="line.272"></a>
-<span class="sourceLineNo">273</span><a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public List&lt;WAL&gt; getWALs() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    return provider.getWALs();<a name="line.275"></a>
-<span class="sourceLineNo">276</span>  }<a name="line.276"></a>
-<span class="sourceLineNo">277</span><a name="line.277"></a>
-<span class="sourceLineNo">278</span>  @VisibleForTesting<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  WALProvider getMetaProvider() throws IOException {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    for (;;) {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      WALProvider provider = this.metaProvider.get();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      if (provider != null) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>        return provider;<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      }<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      boolean metaWALProvPresent = conf.get(META_WAL_PROVIDER_CLASS) != null;<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      provider = createProvider(getProviderClass(<a name="line.286"></a>
-<span class="sourceLineNo">287</span>          metaWALProvPresent ? META_WAL_PROVIDER_CLASS : WAL_PROVIDER_CLASS,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>          META_WAL_PROVIDER, conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.288"></a>
-<span class="sourceLineNo">289</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return provider;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } else {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        // someone is ahead of us, close and try again.<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        provider.close();<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  /**<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   */<a name="line.302"></a>
-<span class="sourceLineNo">303</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    // use different WAL for hbase:meta<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      return getMetaProvider().getWAL(region);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    } else {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      return provider.getWAL(region);<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><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    return createReader(fs, path, (CancelableProgressable)null);<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">317</span>  /**<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * then just seek back to the last known good position.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   * @return A WAL reader.  Close when done with it.<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * @throws IOException<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   */<a name="line.323"></a>
-<span class="sourceLineNo">324</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      CancelableProgressable reporter) throws IOException {<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    return createReader(fs, path, reporter, true);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>  }<a name="line.327"></a>
-<span class="sourceLineNo">328</span><a name="line.328"></a>
-<span class="sourceLineNo">329</span>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      boolean allowCustom) throws IOException {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    try {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      // A wal file could be under recovery, so it may take several<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.335"></a>
-<span class="sourceLineNo">336</span>      // to open it up to 5 minutes by default.<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      int nbAttempt = 0;<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      while (true) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>        try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>          reader.init(fs, path, conf, null);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>          return reader;<a name="line.345"></a>
-<span class="sourceLineNo">346</span>        } catch (IOException e) {<a name="line.346"></a>
-<span class="sourceLineNo">347</span>          if (reader != null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>            try {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>              reader.close();<a name="line.349"></a>
-<span class="sourceLineNo">350</span>            } catch (IOException exception) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.351"></a>
-<span class="sourceLineNo">352</span>              LOG.debug("exception details", exception);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>            }<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          }<a name="line.354"></a>
-<span class="sourceLineNo">355</span><a name="line.355"></a>
-<span class="sourceLineNo">356</span>          String msg = e.getMessage();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>          if (msg != null<a name="line.357"></a>
-<span class="sourceLineNo">358</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.358"></a>
-<span class="sourceLineNo">359</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.359"></a>
-<span class="sourceLineNo">360</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>            if (++nbAttempt == 1) {<a name="line.361"></a>
-<span class="sourceLineNo">362</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>            }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.365"></a>
-<span class="sourceLineNo">366</span>            }<a name="line.366"></a>
-<span class="sourceLineNo">367</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.368"></a>
-<span class="sourceLineNo">369</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>            } else {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>              try {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>                continue; // retry<a name="line.373"></a>
-<span class="sourceLineNo">374</span>              } catch (InterruptedException ie) {<a name="line.374"></a>
-<span class="sourceLineNo">375</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.375"></a>
-<span class="sourceLineNo">376</span>                iioe.initCause(ie);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>                throw iioe;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>              }<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            }<a name="line.379"></a>
-<span class="sourceLineNo">380</span>            throw new LeaseNotRecoveredException(e);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          } else {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            throw e;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    } catch (IOException ie) {<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      throw ie;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    } catch (Exception e) {<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      throw new IOException("Cannot get log reader", e);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  }<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>   * Create a writer for the WAL.<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Uses defaults.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * &lt;p&gt;<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * Should be package-private. public only for tests and<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * @return A WAL writer. Close when done with it.<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   */<a name="line.400"></a>
-<span class="sourceLineNo">401</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    return FSHLogProvider.createWriter(conf, fs, path, 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>   * Should be package-private, visible for recovery testing.<a name="line.406"></a>
-<span class="sourceLineNo">407</span>   * Uses defaults.<a name="line.407"></a>
-<span class="sourceLineNo">408</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.408"></a>
-<span class="sourceLineNo">409</span>   */<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  @VisibleForTesting<a name="line.410"></a>
-<span class="sourceLineNo">411</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  // These static methods are currently used where it's impractical to<a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  // WALFactory that just provides Reader / Writers.<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.421"></a>
-<span class="sourceLineNo">422</span>  <a name="line.422"></a>
-<span class="sourceLineNo">423</span>  // Public only for FSHLog<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    WALFactory factory = singleton.get();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    if (null == factory) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      WALFactory temp = new WALFactory(configuration);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        factory = temp;<a name="line.429"></a>
-<span class="sourceLineNo">430</span>      } else {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        // someone else beat us to initializing<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        try {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>          temp.close();<a name="line.433"></a>
-<span class="sourceLineNo">434</span>        } catch (IOException exception) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>        }<a name="line.436"></a>
-<span class="sourceLineNo">437</span>        factory = singleton.get();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    }<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    return factory;<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  /**<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.444"></a>
-<span class="sourceLineNo">445</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.445"></a>
-<span class="sourceLineNo">446</span>   * @return a WAL Reader, caller must close.<a name="line.446"></a>
-<span class="sourceLineNo">447</span>   */<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      final Configuration configuration) throws IOException {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    return getInstance(configuration).createReader(fs, path);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>  }<a name="line.451"></a>
-<span class="sourceLineNo">452</span><a name="line.452"></a>
-<span class="sourceLineNo">453</span>  /**<a name="line.453"></a>
-<span class="sourceLineNo">454</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.454"></a>
-<span class="sourceLineNo">455</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.455"></a>
-<span class="sourceLineNo">456</span>   * @return a WAL Reader, caller must close.<a name="line.456"></a>
-<span class="sourceLineNo">457</span>   */<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.460"></a>
-<span class="sourceLineNo">461</span>  }<a name="line.461"></a>
-<span class="sourceLineNo">462</span><a name="line.462"></a>
-<span class="sourceLineNo">463</span>  /**<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.464"></a>
-<span class="sourceLineNo">465</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.465"></a>
-<span class="sourceLineNo">466</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.466"></a>
-<span class="sourceLineNo">467</span>   * @return a WAL Reader, caller must close.<a name="line.467"></a>
-<span class="sourceLineNo">468</span>   */<a name="line.468"></a>
-<span class="sourceLineNo">469</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      final Configuration configuration) throws IOException {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.471"></a>
-<span class="sourceLineNo">472</span>  }<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>  /**<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * Uses defaults.<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   */<a name="line.478"></a>
-<span class="sourceLineNo">479</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      final Configuration configuration)<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      throws IOException {<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * Uses defaults.<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   */<a name="line.489"></a>
-<span class="sourceLineNo">490</span>  @VisibleForTesting<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      final Configuration configuration)<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      throws IOException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public final WALProvider getWALProvider() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return this.provider;<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  public final WALProvider getMetaWALProvider() {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    return this.metaProvider.get();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  }<a name="line.503"></a>
-<span class="sourceLineNo">504</span>}<a name="line.504"></a>
+<span class="sourceLineNo">246</span>    provider.shutdown();<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (null != exception) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw exception;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    }<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
+<span class="sourceLineNo">251</span><a name="line.251"></a>
+<span class="sourceLineNo">252</span>  public List&lt;WAL&gt; getWALs() {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    return provider.getWALs();<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>  @VisibleForTesting<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  WALProvider getMetaProvider() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    for (;;) {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      WALProvider provider = this.metaProvider.get();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      if (provider != null) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        return provider;<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      }<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      provider = createProvider(getProviderClass(META_WAL_PROVIDER,<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          conf.get(WAL_PROVIDER, DEFAULT_WAL_PROVIDER)));<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      provider.init(this, conf, AbstractFSWALProvider.META_WAL_PROVIDER_ID);<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      provider.addWALActionsListener(new MetricsWAL());<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      if (metaProvider.compareAndSet(null, provider)) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>        return provider;<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      } else {<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        // someone is ahead of us, close and try again.<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        provider.close();<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      }<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    }<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>  /**<a name="line.276"></a>
+<span class="sourceLineNo">277</span>   * @param region the region which we want to get a WAL for it. Could be null.<a name="line.277"></a>
+<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
+<span class="sourceLineNo">279</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // use different WAL for hbase:meta<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    if (region != null &amp;&amp; region.isMetaRegion() &amp;&amp;<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      region.getReplicaId() == RegionInfo.DEFAULT_REPLICA_ID) {<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      return getMetaProvider().getWAL(region);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    } else {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      return provider.getWAL(region);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    }<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span><a name="line.288"></a>
+<span class="sourceLineNo">289</span>  public Reader createReader(final FileSystem fs, final Path path) throws IOException {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    return createReader(fs, path, (CancelableProgressable)null);<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  }<a name="line.291"></a>
+<span class="sourceLineNo">292</span><a name="line.292"></a>
+<span class="sourceLineNo">293</span>  /**<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   * Create a reader for the WAL. If you are reading from a file that's being written to and need<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * to reopen it multiple times, use {@link WAL.Reader#reset()} instead of this method<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * then just seek back to the last known good position.<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * @return A WAL reader.  Close when done with it.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   * @throws IOException<a name="line.298"></a>
+<span class="sourceLineNo">299</span>   */<a name="line.299"></a>
+<span class="sourceLineNo">300</span>  public Reader createReader(final FileSystem fs, final Path path,<a name="line.300"></a>
+<span class="sourceLineNo">301</span>      CancelableProgressable reporter) throws IOException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return createReader(fs, path, reporter, true);<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public Reader createReader(final FileSystem fs, final Path path, CancelableProgressable reporter,<a name="line.305"></a>
+<span class="sourceLineNo">306</span>      boolean allowCustom) throws IOException {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    Class&lt;? extends AbstractFSWALProvider.Reader&gt; lrClass =<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        allowCustom ? logReaderClass : ProtobufLogReader.class;<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    try {<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      // A wal file could be under recovery, so it may take several<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      // tries to get it open. Instead of claiming it is corrupted, retry<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      // to open it up to 5 minutes by default.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      long startWaiting = EnvironmentEdgeManager.currentTime();<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      long openTimeout = timeoutMillis + startWaiting;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      int nbAttempt = 0;<a name="line.315"></a>
+<span class="sourceLineNo">316</span>      AbstractFSWALProvider.Reader reader = null;<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      while (true) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        try {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>          reader = lrClass.getDeclaredConstructor().newInstance();<a name="line.319"></a>
+<span class="sourceLineNo">320</span>          reader.init(fs, path, conf, null);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>          return reader;<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        } catch (IOException e) {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          if (reader != null) {<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            try {<a name="line.324"></a>
+<span class="sourceLineNo">325</span>              reader.close();<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            } catch (IOException exception) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>              LOG.warn("Could not close FSDataInputStream" + exception.getMessage());<a name="line.327"></a>
+<span class="sourceLineNo">328</span>              LOG.debug("exception details", exception);<a name="line.328"></a>
+<span class="sourceLineNo">329</span>            }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>          }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>          String msg = e.getMessage();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>          if (msg != null<a name="line.333"></a>
+<span class="sourceLineNo">334</span>              &amp;&amp; (msg.contains("Cannot obtain block length")<a name="line.334"></a>
+<span class="sourceLineNo">335</span>                  || msg.contains("Could not obtain the last block") || msg<a name="line.335"></a>
+<span class="sourceLineNo">336</span>                    .matches("Blocklist for [^ ]* has changed.*"))) {<a name="line.336"></a>
+<span class="sourceLineNo">337</span>            if (++nbAttempt == 1) {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>              LOG.warn("Lease should have recovered. This is not expected. Will retry", e);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>            }<a name="line.339"></a>
+<span class="sourceLineNo">340</span>            if (reporter != null &amp;&amp; !reporter.progress()) {<a name="line.340"></a>
+<span class="sourceLineNo">341</span>              throw new InterruptedIOException("Operation is cancelled");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>            }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>            if (nbAttempt &gt; 2 &amp;&amp; openTimeout &lt; EnvironmentEdgeManager.currentTime()) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>              LOG.error("Can't open after " + nbAttempt + " attempts and "<a name="line.344"></a>
+<span class="sourceLineNo">345</span>                  + (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);<a name="line.345"></a>
+<span class="sourceLineNo">346</span>            } else {<a name="line.346"></a>
+<span class="sourceLineNo">347</span>              try {<a name="line.347"></a>
+<span class="sourceLineNo">348</span>                Thread.sleep(nbAttempt &lt; 3 ? 500 : 1000);<a name="line.348"></a>
+<span class="sourceLineNo">349</span>                continue; // retry<a name="line.349"></a>
+<span class="sourceLineNo">350</span>              } catch (InterruptedException ie) {<a name="line.350"></a>
+<span class="sourceLineNo">351</span>                InterruptedIOException iioe = new InterruptedIOException();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>                iioe.initCause(ie);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>                throw iioe;<a name="line.353"></a>
+<span class="sourceLineNo">354</span>              }<a name="line.354"></a>
+<span class="sourceLineNo">355</span>            }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>            throw new LeaseNotRecoveredException(e);<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          } else {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            throw e;<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>    } catch (IOException ie) {<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      throw ie;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    } catch (Exception e) {<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      throw new IOException("Cannot get log reader", e);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  /**<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   * Create a writer for the WAL.<a name="line.370"></a>
+<span class="sourceLineNo">371</span>   * Uses defaults.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>   * &lt;p&gt;<a name="line.372"></a>
+<span class="sourceLineNo">373</span>   * Should be package-private. public only for tests and<a name="line.373"></a>
+<span class="sourceLineNo">374</span>   * {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * @return A WAL writer. Close when done with it.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   */<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  public Writer createWALWriter(final FileSystem fs, final Path path) throws IOException {<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    return FSHLogProvider.createWriter(conf, fs, path, false);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  }<a name="line.379"></a>
+<span class="sourceLineNo">380</span><a name="line.380"></a>
+<span class="sourceLineNo">381</span>  /**<a name="line.381"></a>
+<span class="sourceLineNo">382</span>   * Should be package-private, visible for recovery testing.<a name="line.382"></a>
+<span class="sourceLineNo">383</span>   * Uses defaults.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @return an overwritable writer for recovered edits. caller should close.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  @VisibleForTesting<a name="line.386"></a>
+<span class="sourceLineNo">387</span>  public Writer createRecoveredEditsWriter(final FileSystem fs, final Path path)<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      throws IOException {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    return FSHLogProvider.createWriter(conf, fs, path, true);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  // These static methods are currently used where it's impractical to<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // untangle the reliance on state in the filesystem. They rely on singleton<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  // WALFactory that just provides Reader / Writers.<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  // For now, first Configuration object wins. Practically this just impacts the reader/writer class<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  private static final AtomicReference&lt;WALFactory&gt; singleton = new AtomicReference&lt;&gt;();<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  private static final String SINGLETON_ID = WALFactory.class.getName();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  <a name="line.398"></a>
+<span class="sourceLineNo">399</span>  // Public only for FSHLog<a name="line.399"></a>
+<span class="sourceLineNo">400</span>  public static WALFactory getInstance(Configuration configuration) {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    WALFactory factory = singleton.get();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (null == factory) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      WALFactory temp = new WALFactory(configuration);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      if (singleton.compareAndSet(null, temp)) {<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        factory = temp;<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      } else {<a name="line.406"></a>
+<span class="sourceLineNo">407</span>        // someone else beat us to initializing<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        try {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>          temp.close();<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        } catch (IOException exception) {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          LOG.debug("failed to close temporary singleton. ignoring.", exception);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        }<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        factory = singleton.get();<a name="line.413"></a>
+<span class="sourceLineNo">414</span>      }<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return factory;<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>  /**<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * @return a WAL Reader, caller must close.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  public static Reader createReader(final FileSystem fs, final Path path,<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      final Configuration configuration) throws IOException {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return getInstance(configuration).createReader(fs, path);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  /**<a name="line.429"></a>
+<span class="sourceLineNo">430</span>   * Create a reader for the given path, accept custom reader classes from conf.<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * @return a WAL Reader, caller must close.<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  static Reader createReader(final FileSystem fs, final Path path,<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      final Configuration configuration, final CancelableProgressable reporter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    return getInstance(configuration).createReader(fs, path, reporter);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>  /**<a name="line.439"></a>
+<span class="sourceLineNo">440</span>   * Create a reader for the given path, ignore custom reader classes from conf.<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   * only public pending move of {@link org.apache.hadoop.hbase.regionserver.wal.Compressor}<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @return a WAL Reader, caller must close.<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public static Reader createReaderIgnoreCustomClass(final FileSystem fs, final Path path,<a name="line.445"></a>
+<span class="sourceLineNo">446</span>      final Configuration configuration) throws IOException {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    return getInstance(configuration).createReader(fs, path, null, false);<a name="line.447"></a>
+<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
+<span class="sourceLineNo">449</span><a name="line.449"></a>
+<span class="sourceLineNo">450</span>  /**<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.451"></a>
+<span class="sourceLineNo">452</span>   * Uses defaults.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>   * @return a Writer that will overwrite files. Caller must close.<a name="line.453"></a>
+<span class="sourceLineNo">454</span>   */<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  static Writer createRecoveredEditsWriter(final FileSystem fs, final Path path,<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      final Configuration configuration)<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      throws IOException {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return FSHLogProvider.createWriter(configuration, fs, path, true);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span><a name="line.460"></a>
+<span class="sourceLineNo">461</span>  /**<a name="line.461"></a>
+<span class="sourceLineNo">462</span>   * If you already have a WALFactory, you should favor the instance method.<a name="line.462"></a>
+<span class="sourceLineNo">463</span>   * Uses defaults.<a name="line.463"></a>
+<span class="sourceLineNo">464</span>   * @return a writer that won't overwrite files. Caller must close.<a name="line.464"></a>
+<span class="sourceLineNo">465</span>   */<a name="line.465"></a>
+<span class="sourceLineNo">466</span>  @VisibleForTesting<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public static Writer createWALWriter(final FileSystem fs, final Path path,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      final Configuration configuration)<a name="line.468"></a>
+<span class="sourceLineNo">469</span>      throws IOException {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return FSHLogProvider.createWriter(configuration, fs, path, false);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>  }<a name="line.471"></a>
+<span class="sourceLineNo">472</span><a name="line.472"></a>
+<span class="sourceLineNo">473</span>  public final WALProvider getWALProvider() {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    return this.provider;<a name="line.474"></a>
+<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>  public final WALProvider getMetaWALProvider() {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    return this.metaProvider.get();<a name="line.478"></a>
+<span class="sourceLineNo">479</span>  }<a name="line.479"></a>
+<span class="sourceLineNo">480</span>}<a name="line.480"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 6ba0cc1..35d0a86 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -423,7 +423,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 13bbb7a..86acd11 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index e5868b3..33860e2 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -411,7 +411,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index 838a113..2ebf729 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index d89d18c..8fd35a7 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 


[23/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        if (abortOnCorruption &amp;&amp; corruptedCo

<TRUNCATED>

[39/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.html b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.html
index 5dfa6bd..1572586 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":9,"i5":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.39">JVMClusterUtil</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.40">JVMClusterUtil</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">Utility used running a cluster all in the one JVM.</div>
 </li>
@@ -226,6 +226,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <div class="block">Start the cluster.</div>
 </td>
 </tr>
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>private static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.html#waitForEvent-long-java.lang.String-java.util.function.Supplier-">waitForEvent</a></span>(long&nbsp;millis,
+            <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;action,
+            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;check)</code>
+<div class="block">Utility method to wait some time for an event to occur, and then return control to the caller.</div>
+</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
@@ -254,7 +262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/util/JVMClusterUtil.html#line.40">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.41">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -271,7 +279,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JVMClusterUtil</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.39">JVMClusterUtil</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.40">JVMClusterUtil</a>()</pre>
 </li>
 </ul>
 </li>
@@ -288,7 +296,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRegionServerThread</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.RegionServerThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.80">createRegionServerThread</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.RegionServerThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.81">createRegionServerThread</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                                          <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;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&gt;&nbsp;hrsc,
                                                                          int&nbsp;index)
                                                                   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>
@@ -312,7 +320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createMasterThread</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.127">createMasterThread</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.128">createMasterThread</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                              <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;? extends <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&gt;&nbsp;hmc,
                                                              int&nbsp;index)
                                                       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>
@@ -336,7 +344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>findActiveMaster</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.145">findActiveMaster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters)</pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.146">findActiveMaster</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters)</pre>
 </li>
 </ul>
 <a name="startup-java.util.List-java.util.List-">
@@ -345,7 +353,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startup</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.163">startup</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters,
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.164">startup</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters,
                              <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/util/JVMClusterUtil.RegionServerThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.RegionServerThread</a>&gt;&nbsp;regionservers)
                       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">Start the cluster.  Waits until there is a primary master initialized
@@ -361,13 +369,37 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="waitForEvent-long-java.lang.String-java.util.function.Supplier-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>waitForEvent</h4>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.217">waitForEvent</a>(long&nbsp;millis,
+                                 <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;action,
+                                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html?is-external=true" title="class or interface in java.util.function">Supplier</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&gt;&nbsp;check)
+                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
+<div class="block">Utility method to wait some time for an event to occur, and then return control to the caller.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>millis</code> - How long to wait, in milliseconds.</dd>
+<dd><code>action</code> - The action that we are waiting for. Will be used in log message if the event
+               does not occur.</dd>
+<dd><code>check</code> - A Supplier that will be checked periodically to produce an updated true/false
+              result indicating if the expected event has happened or not.</dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></code> - If we are interrupted while waiting for the event.</dd>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang">RuntimeException</a></code> - If we reach the specified timeout while waiting for the event.</dd>
+</dl>
+</li>
+</ul>
 <a name="shutdown-java.util.List-java.util.List-">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.236">shutdown</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.245">shutdown</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.MasterThread</a>&gt;&nbsp;masters,
                             <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/util/JVMClusterUtil.RegionServerThread.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil.RegionServerThread</a>&gt;&nbsp;regionservers)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html b/devapidocs/org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html
index 8622246..74379b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" target="_top">Frames</a></li>
@@ -325,7 +325,7 @@ not permitted.)</div>
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/Random64.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/Random64.html b/devapidocs/org/apache/hadoop/hbase/util/Random64.html
new file mode 100644
index 0000000..761626a
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/util/Random64.html
@@ -0,0 +1,437 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Random64 (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Random64 (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":9,"i1":10,"i2":10,"i3":10,"i4":9};
+var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/Random64.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/util/Random64.html" target="_top">Frames</a></li>
+<li><a href="Random64.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&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><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>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.util</div>
+<h2 title="Class Random64" class="title">Class Random64</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.util.Random64</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<hr>
+<br>
+<pre>@InterfaceAudience.Private
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.38">Random64</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">An instance of this class is used to generate a stream of
+ pseudorandom numbers. The class uses a 64-bit seed, which is
+ modified using a linear congruential formula.
+
+ see https://en.wikipedia.org/wiki/Linear_congruential_generator</div>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- =========== 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>private static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#addend">addend</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#multiplier">multiplier</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#seed">seed</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#seedUniquifier">seedUniquifier</a></span></code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#Random64--">Random64</a></span>()</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#Random64-long-">Random64</a></span>(long&nbsp;seed)</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t1" class="tableTab"><span><a href="javascript:show(1);">Static Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>static void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#main-java.lang.String:A-">main</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)</code>
+<div class="block">Random64 is a pseudorandom algorithm(LCG).</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>private long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#next64-int-">next64</a></span>(int&nbsp;bits)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#nextBytes-byte:A-">nextBytes</a></span>(byte[]&nbsp;bytes)</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
+<td class="colFirst"><code>long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#nextLong--">nextLong</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>private static long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html#seedUniquifier--">seedUniquifier</a></span>()</code>
+<div class="block">Copy from <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true#seedUniquifier--" title="class or interface in java.util"><code>Random.seedUniquifier()</code></a></div>
+</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<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="multiplier">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>multiplier</h4>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.40">multiplier</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.Random64.multiplier">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="addend">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>addend</h4>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.41">addend</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.util.Random64.addend">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="seedUniquifier">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>seedUniquifier</h4>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.43">seedUniquifier</a></pre>
+</li>
+</ul>
+<a name="seed">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>seed</h4>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.46">seed</a></pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="Random64--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>Random64</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.61">Random64</a>()</pre>
+</li>
+</ul>
+<a name="Random64-long-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>Random64</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.65">Random64</a>(long&nbsp;seed)</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="seedUniquifier--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>seedUniquifier</h4>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.51">seedUniquifier</a>()</pre>
+<div class="block">Copy from <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true#seedUniquifier--" title="class or interface in java.util"><code>Random.seedUniquifier()</code></a></div>
+</li>
+</ul>
+<a name="nextLong--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>nextLong</h4>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.69">nextLong</a>()</pre>
+</li>
+</ul>
+<a name="nextBytes-byte:A-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>nextBytes</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.73">nextBytes</a>(byte[]&nbsp;bytes)</pre>
+</li>
+</ul>
+<a name="next64-int-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>next64</h4>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.83">next64</a>(int&nbsp;bits)</pre>
+</li>
+</ul>
+<a name="main-java.lang.String:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>main</h4>
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/Random64.html#line.99">main</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;args)</pre>
+<div class="block">Random64 is a pseudorandom algorithm(LCG). Therefore, we will get same sequence
+ if seeds are the same. This main will test how many calls nextLong() it will
+ get the same seed.
+
+ We do not need to save all numbers (that is too large). We could save
+ once every 100000 calls nextLong(). If it get a same seed, we can
+ detect this by calling nextLong() 100000 times continuously.</div>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/Random64.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/util/Random64.html" target="_top">Frames</a></li>
+<li><a href="Random64.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li>Nested&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><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>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html b/devapidocs/org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html
index 6eeec85..a4253e7 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/ReadOnlyByteRangeException.html
@@ -43,7 +43,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/util/ReflectionUtils.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -229,7 +229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Unsupported
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/util/ReflectionUtils.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/class-use/Random64.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/class-use/Random64.html b/devapidocs/org/apache/hadoop/hbase/util/class-use/Random64.html
new file mode 100644
index 0000000..bcca45f
--- /dev/null
+++ b/devapidocs/org/apache/hadoop/hbase/util/class-use/Random64.html
@@ -0,0 +1,125 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Uses of Class org.apache.hadoop.hbase.util.Random64 (Apache HBase 3.0.0-SNAPSHOT API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="Uses of Class org.apache.hadoop.hbase.util.Random64 (Apache HBase 3.0.0-SNAPSHOT API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/util/class-use/Random64.html" target="_top">Frames</a></li>
+<li><a href="Random64.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<div class="header">
+<h2 title="Uses of Class org.apache.hadoop.hbase.util.Random64" class="title">Uses of Class<br>org.apache.hadoop.hbase.util.Random64</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.util.Random64</div>
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="../package-summary.html">Package</a></li>
+<li><a href="../../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Class</a></li>
+<li class="navBarCell1Rev">Use</li>
+<li><a href="../../../../../../overview-tree.html">Tree</a></li>
+<li><a href="../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li>Prev</li>
+<li>Next</li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../index.html?org/apache/hadoop/hbase/util/class-use/Random64.html" target="_top">Frames</a></li>
+<li><a href="Random64.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/package-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-frame.html b/devapidocs/org/apache/hadoop/hbase/util/package-frame.html
index 531f77e..b914b7c 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-frame.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-frame.html
@@ -174,6 +174,7 @@
 <li><a href="PoolMap.RoundRobinPool.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">PoolMap.RoundRobinPool</a></li>
 <li><a href="PoolMap.ThreadLocalPool.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">PoolMap.ThreadLocalPool</a></li>
 <li><a href="PrettyPrinter.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">PrettyPrinter</a></li>
+<li><a href="Random64.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">Random64</a></li>
 <li><a href="ReflectionUtils.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">ReflectionUtils</a></li>
 <li><a href="RegionMover.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">RegionMover</a></li>
 <li><a href="RegionMover.RegionMoverBuilder.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">RegionMover.RegionMoverBuilder</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-summary.html b/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
index a8d1c76..82a1d0a 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-summary.html
@@ -1038,29 +1038,36 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></td>
+<td class="colLast">
+<div class="block">An instance of this class is used to generate a stream of
+ pseudorandom numbers.</div>
+</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ReflectionUtils.html" title="class in org.apache.hadoop.hbase.util">ReflectionUtils</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionMover.html" title="class in org.apache.hadoop.hbase.util">RegionMover</a></td>
 <td class="colLast">
 <div class="block">Tool for loading/unloading regions to/from given regionserver This tool can be run from Command
  line directly as a utility.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionMover.RegionMoverBuilder.html" title="class in org.apache.hadoop.hbase.util">RegionMover.RegionMoverBuilder</a></td>
 <td class="colLast">
 <div class="block">Builder for Region mover.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitCalculator.html" title="class in org.apache.hadoop.hbase.util">RegionSplitCalculator</a>&lt;R extends <a href="../../../../../org/apache/hadoop/hbase/util/KeyRange.html" title="interface in org.apache.hadoop.hbase.util">KeyRange</a>&gt;</td>
 <td class="colLast">
 <div class="block">This is a generic region split calculator.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter</a></td>
 <td class="colLast">
 <div class="block">The <a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.html" title="class in org.apache.hadoop.hbase.util"><code>RegionSplitter</code></a> class provides several utilities to help in the
@@ -1068,233 +1075,233 @@
  instead of having HBase handle that automatically.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.DecimalStringSplit.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter.DecimalStringSplit</a></td>
 <td class="colLast">
 <div class="block">The format of a DecimalStringSplit region boundary is the ASCII representation of
  reversed sequential number, or any other uniformly distributed decimal value.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.HexStringSplit.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter.HexStringSplit</a></td>
 <td class="colLast">
 <div class="block">HexStringSplit is a well-known <a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.SplitAlgorithm.html" title="interface in org.apache.hadoop.hbase.util"><code>RegionSplitter.SplitAlgorithm</code></a> for choosing region
  boundaries.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.NumberStringSplit.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter.NumberStringSplit</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RegionSplitter.UniformSplit.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter.UniformSplit</a></td>
 <td class="colLast">
 <div class="block">A SplitAlgorithm that divides the space of possible keys evenly.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.html" title="class in org.apache.hadoop.hbase.util">RetryCounter</a></td>
 <td class="colLast">
 <div class="block">Operation retry accounting.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.BackoffPolicy.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.BackoffPolicy</a></td>
 <td class="colLast">
 <div class="block">Policy for calculating sleeping intervals between retry attempts</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.ExponentialBackoffPolicy.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.ExponentialBackoffPolicy</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.ExponentialBackoffPolicyWithLimit.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.ExponentialBackoffPolicyWithLimit</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounter.RetryConfig.html" title="class in org.apache.hadoop.hbase.util">RetryCounter.RetryConfig</a></td>
 <td class="colLast">
 <div class="block">Configuration for a retry counter</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RetryCounterFactory.html" title="class in org.apache.hadoop.hbase.util">RetryCounterFactory</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RollingStatCalculator.html" title="class in org.apache.hadoop.hbase.util">RollingStatCalculator</a></td>
 <td class="colLast">
 <div class="block">This class maintains mean and variation for any sequence of input provided to it.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowBloomContext.html" title="class in org.apache.hadoop.hbase.util">RowBloomContext</a></td>
 <td class="colLast">
 <div class="block">Handles ROW bloom related context.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowBloomHashKey.html" title="class in org.apache.hadoop.hbase.util">RowBloomHashKey</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowColBloomContext.html" title="class in org.apache.hadoop.hbase.util">RowColBloomContext</a></td>
 <td class="colLast">
 <div class="block">Handles ROWCOL bloom related context.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowColBloomHashKey.html" title="class in org.apache.hadoop.hbase.util">RowColBloomHashKey</a></td>
 <td class="colLast">
 <div class="block">An hash key for ROWCOL bloom.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowPrefixDelimiterBloomContext.html" title="class in org.apache.hadoop.hbase.util">RowPrefixDelimiterBloomContext</a></td>
 <td class="colLast">
 <div class="block">Handles ROWPREFIX_DELIMITED bloom related context.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/RowPrefixFixedLengthBloomContext.html" title="class in org.apache.hadoop.hbase.util">RowPrefixFixedLengthBloomContext</a></td>
 <td class="colLast">
 <div class="block">Handles ROWPREFIX bloom related context.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ServerCommandLine.html" title="class in org.apache.hadoop.hbase.util">ServerCommandLine</a></td>
 <td class="colLast">
 <div class="block">Base class for command lines that start up various HBase daemons.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.html" title="class in org.apache.hadoop.hbase.util">ServerRegionReplicaUtil</a></td>
 <td class="colLast">
 <div class="block">Similar to <a href="../../../../../org/apache/hadoop/hbase/client/RegionReplicaUtil.html" title="class in org.apache.hadoop.hbase.client"><code>RegionReplicaUtil</code></a> but for the server side</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ShutdownHookManager.html" title="class in org.apache.hadoop.hbase.util">ShutdownHookManager</a></td>
 <td class="colLast">
 <div class="block">This class provides ShutdownHookManager shims for HBase to interact with the Hadoop 1.0.x and the
  Hadoop 2.0+ series.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ShutdownHookManager.ShutdownHookManagerV1.html" title="class in org.apache.hadoop.hbase.util">ShutdownHookManager.ShutdownHookManagerV1</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ShutdownHookManager.ShutdownHookManagerV2.html" title="class in org.apache.hadoop.hbase.util">ShutdownHookManager.ShutdownHookManagerV2</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SimpleByteRange.html" title="class in org.apache.hadoop.hbase.util">SimpleByteRange</a></td>
 <td class="colLast">
 <div class="block">A read only version of the <a href="../../../../../org/apache/hadoop/hbase/util/ByteRange.html" title="interface in org.apache.hadoop.hbase.util"><code>ByteRange</code></a>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SimpleMutableByteRange.html" title="class in org.apache.hadoop.hbase.util">SimpleMutableByteRange</a></td>
 <td class="colLast">
 <div class="block">A basic mutable <a href="../../../../../org/apache/hadoop/hbase/util/ByteRange.html" title="interface in org.apache.hadoop.hbase.util"><code>ByteRange</code></a> implementation.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SimplePositionedByteRange.html" title="class in org.apache.hadoop.hbase.util">SimplePositionedByteRange</a></td>
 <td class="colLast">
 <div class="block">Extends the basic <a href="../../../../../org/apache/hadoop/hbase/util/SimpleMutableByteRange.html" title="class in org.apache.hadoop.hbase.util"><code>SimpleMutableByteRange</code></a> implementation with position
  support and it is a readonly version.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SimplePositionedMutableByteRange.html" title="class in org.apache.hadoop.hbase.util">SimplePositionedMutableByteRange</a></td>
 <td class="colLast">
 <div class="block">Extends the basic <a href="../../../../../org/apache/hadoop/hbase/util/AbstractPositionedByteRange.html" title="class in org.apache.hadoop.hbase.util"><code>AbstractPositionedByteRange</code></a> implementation with
  position support and it is a mutable version.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Sleeper.html" title="class in org.apache.hadoop.hbase.util">Sleeper</a></td>
 <td class="colLast">
 <div class="block">Sleeper for current thread.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SoftObjectPool.html" title="class in org.apache.hadoop.hbase.util">SoftObjectPool</a>&lt;K,V&gt;</td>
 <td class="colLast">
 <div class="block">A <code>SoftReference</code> based shared object pool.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/SortedList.html" title="class in org.apache.hadoop.hbase.util">SortedList</a>&lt;E&gt;</td>
 <td class="colLast">
 <div class="block">Simple sorted list implementation that uses <a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util"><code>ArrayList</code></a> as
  the underlying collection so we can support RandomAccess.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/StealJobQueue.html" title="class in org.apache.hadoop.hbase.util">StealJobQueue</a>&lt;T&gt;</td>
 <td class="colLast">
 <div class="block">This queue allows a ThreadPoolExecutor to steal jobs from another ThreadPoolExecutor.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Strings.html" title="class in org.apache.hadoop.hbase.util">Strings</a></td>
 <td class="colLast">
 <div class="block">Utility for Strings.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Threads.html" title="class in org.apache.hadoop.hbase.util">Threads</a></td>
 <td class="colLast">
 <div class="block">Thread Utility</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Threads.PrintThreadInfoLazyHolder.html" title="class in org.apache.hadoop.hbase.util">Threads.PrintThreadInfoLazyHolder</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Triple.html" title="class in org.apache.hadoop.hbase.util">Triple</a>&lt;A,B,C&gt;</td>
 <td class="colLast">
 <div class="block">Utility class to manage a triple.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/UnsafeAccess.html" title="class in org.apache.hadoop.hbase.util">UnsafeAccess</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/UnsafeAvailChecker.html" title="class in org.apache.hadoop.hbase.util">UnsafeAvailChecker</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/VersionInfo.html" title="class in org.apache.hadoop.hbase.util">VersionInfo</a></td>
 <td class="colLast">
 <div class="block">This class finds the Version information for HBase.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/WeakObjectPool.html" title="class in org.apache.hadoop.hbase.util">WeakObjectPool</a>&lt;K,V&gt;</td>
 <td class="colLast">
 <div class="block">A <code>WeakReference</code> based shared object pool.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/Writables.html" title="class in org.apache.hadoop.hbase.util">Writables</a></td>
 <td class="colLast">
 <div class="block">Utility class with methods for manipulating Writable objects</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/YammerHistogramUtils.html" title="class in org.apache.hadoop.hbase.util">YammerHistogramUtils</a></td>
 <td class="colLast">
 <div class="block">Utility functions for working with Yammer Metrics.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/util/ZKDataMigrator.html" title="class in org.apache.hadoop.hbase.util">ZKDataMigrator</a></td>
 <td class="colLast">Deprecated
 <div class="block"><span class="deprecationComment">Since 2.0.0.</span></div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 64bc1d5..1069aae 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -340,6 +340,7 @@
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PairOfSameType.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">PairOfSameType</span></a>&lt;T&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap</span></a>&lt;K,V&gt; (implements java.util.<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;K,V&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Random64</span></a></li>
 <li type="circle">java.lang.ref.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ref/Reference.html?is-external=true" title="class or interface in java.lang.ref"><span class="typeNameLink">Reference</span></a>&lt;T&gt;
 <ul>
 <li type="circle">java.lang.ref.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ref/SoftReference.html?is-external=true" title="class or interface in java.lang.ref"><span class="typeNameLink">SoftReference</span></a>&lt;T&gt;
@@ -518,14 +519,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/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/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/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/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
index 7114b2c..288bb00 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.255">RegionGroupingProvider.IdentityGroupingStrategy</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.252">RegionGroupingProvider.IdentityGroupingStrategy</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/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a></pre>
 </li>
@@ -210,7 +210,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IdentityGroupingStrategy</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.255">IdentityGroupingStrategy</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.252">IdentityGroupingStrategy</a>()</pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.257">init</a>(org.apache.hadoop.conf.Configuration&nbsp;config,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.254">init</a>(org.apache.hadoop.conf.Configuration&nbsp;config,
                  <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;providerId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -241,7 +241,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingPro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>group</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/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.259">group</a>(byte[]&nbsp;identifier,
+<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/wal/RegionGroupingProvider.IdentityGroupingStrategy.html#line.256">group</a>(byte[]&nbsp;identifier,
                     byte[]&nbsp;namespace)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html#group-byte:A-byte:A-">RegionGroupingProvider.RegionGroupingStrategy</a></code></span></div>
 <div class="block">Given an identifier and a namespace, pick a group.</div>


[50/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 4aa20b1..ddfa48d 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -281,10 +281,10 @@
 <th><img src="images/icon_warning_sml.gif" alt="" />&#160;Warnings</th>
 <th><img src="images/icon_error_sml.gif" alt="" />&#160;Errors</th></tr>
 <tr class="b">
-<td>3760</td>
+<td>3762</td>
 <td>0</td>
 <td>0</td>
-<td>15158</td></tr></table></div>
+<td>15156</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5697,7 +5697,7 @@
 <td><a href="#org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.java">org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>5</td></tr>
+<td>4</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.procedure2.util.DelayedUtil.java">org/apache/hadoop/hbase/procedure2/util/DelayedUtil.java</a></td>
 <td>0</td>
@@ -9142,7 +9142,7 @@
 <td><a href="#org.apache.hadoop.hbase.util.JVMClusterUtil.java">org/apache/hadoop/hbase/util/JVMClusterUtil.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>11</td></tr>
+<td>10</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.util.JenkinsHash.java">org/apache/hadoop/hbase/util/JenkinsHash.java</a></td>
 <td>0</td>
@@ -9739,7 +9739,7 @@
 <tr class="b">
 <td></td>
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_blocks.html#NeedBraces">NeedBraces</a></td>
-<td>1802</td>
+<td>1801</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="a">
 <td>coding</td>
@@ -9818,7 +9818,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_imports.html#UnusedImports">UnusedImports</a>
 <ul>
 <li>processJavadoc: <tt>&quot;true&quot;</tt></li></ul></td>
-<td>111</td>
+<td>110</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>indentation</td>
@@ -19947,31 +19947,31 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 134).</td>
-<td>279</td></tr>
+<td>278</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 142).</td>
-<td>281</td></tr>
+<td>280</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 141).</td>
-<td>283</td></tr>
+<td>282</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 134).</td>
-<td>309</td></tr>
+<td>308</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 131).</td>
-<td>313</td></tr></table></div>
+<td>312</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.chaos.actions.ChangeCompressionAction.java">org/apache/hadoop/hbase/chaos/actions/ChangeCompressionAction.java</h3>
 <table border="0" class="table table-striped">
@@ -60300,919 +60300,919 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>450</td></tr>
+<td>451</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>453</td></tr>
+<td>454</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ctor def' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>454</td></tr>
+<td>455</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>464</td></tr>
+<td>465</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>466</td></tr>
+<td>467</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>467</td></tr>
+<td>468</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>469</td></tr>
+<td>470</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 118).</td>
-<td>470</td></tr>
+<td>471</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
-<td>471</td></tr>
+<td>472</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>472</td></tr>
+<td>473</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 115).</td>
-<td>476</td></tr>
+<td>477</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>505</td></tr>
+<td>506</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 114).</td>
-<td>650</td></tr>
+<td>651</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 131).</td>
-<td>664</td></tr>
+<td>665</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>794</td></tr>
+<td>795</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 279 lines (max allowed is 150).</td>
-<td>892</td></tr>
+<td>893</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1383</td></tr>
+<td>1384</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1385</td></tr>
+<td>1386</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1387</td></tr>
+<td>1388</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1389</td></tr>
+<td>1390</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1391</td></tr>
+<td>1392</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1399</td></tr>
+<td>1400</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1400</td></tr>
+<td>1401</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1405</td></tr>
+<td>1406</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 3, expected level should be 4.</td>
-<td>1406</td></tr>
+<td>1407</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1614</td></tr>
+<td>1621</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1636</td></tr>
+<td>1643</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1653</td></tr>
+<td>1660</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1688</td></tr>
+<td>1695</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>1832</td></tr>
+<td>1839</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
-<td>1836</td></tr>
+<td>1843</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1848</td></tr>
+<td>1855</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1850</td></tr>
+<td>1857</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1852</td></tr>
+<td>1859</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1855</td></tr>
+<td>1862</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1858</td></tr>
+<td>1865</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1859</td></tr>
+<td>1866</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1861</td></tr>
+<td>1868</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1863</td></tr>
+<td>1870</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1864</td></tr>
+<td>1871</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>1865</td></tr>
+<td>1872</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1871</td></tr>
+<td>1878</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1875</td></tr>
+<td>1882</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1877</td></tr>
+<td>1884</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1878</td></tr>
+<td>1885</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1881</td></tr>
+<td>1888</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1882</td></tr>
+<td>1889</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1884</td></tr>
+<td>1891</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>1886</td></tr>
+<td>1893</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>1887</td></tr>
+<td>1894</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>1888</td></tr>
+<td>1895</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
-<td>1907</td></tr>
+<td>1914</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>1909</td></tr>
+<td>1916</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2000</td></tr>
+<td>2007</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2002</td></tr>
+<td>2009</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2004</td></tr>
+<td>2011</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2011</td></tr>
+<td>2018</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2012</td></tr>
+<td>2019</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2014</td></tr>
+<td>2021</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2016</td></tr>
+<td>2023</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2017</td></tr>
+<td>2024</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2019</td></tr>
+<td>2026</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2021</td></tr>
+<td>2028</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2022</td></tr>
+<td>2029</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2023</td></tr>
+<td>2030</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>2053</td></tr>
+<td>2060</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2315</td></tr>
+<td>2322</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2316</td></tr>
+<td>2323</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2323</td></tr>
+<td>2330</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2324</td></tr>
+<td>2331</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2330</td></tr>
+<td>2337</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2331</td></tr>
+<td>2338</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2338</td></tr>
+<td>2345</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>2339</td></tr>
+<td>2346</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2344</td></tr>
+<td>2351</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2362</td></tr>
+<td>2369</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2364</td></tr>
+<td>2371</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2366</td></tr>
+<td>2373</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2372</td></tr>
+<td>2379</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2373</td></tr>
+<td>2380</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2375</td></tr>
+<td>2382</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2377</td></tr>
+<td>2384</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2378</td></tr>
+<td>2385</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2380</td></tr>
+<td>2387</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2382</td></tr>
+<td>2389</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2383</td></tr>
+<td>2390</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2384</td></tr>
+<td>2391</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2397</td></tr>
+<td>2404</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2399</td></tr>
+<td>2406</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2401</td></tr>
+<td>2408</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2402</td></tr>
+<td>2409</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2403</td></tr>
+<td>2410</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2405</td></tr>
+<td>2412</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2407</td></tr>
+<td>2414</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2408</td></tr>
+<td>2415</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2410</td></tr>
+<td>2417</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2412</td></tr>
+<td>2419</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2413</td></tr>
+<td>2420</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2414</td></tr>
+<td>2421</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2497</td></tr>
+<td>2504</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2499</td></tr>
+<td>2506</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2505</td></tr>
+<td>2512</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2506</td></tr>
+<td>2513</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2507</td></tr>
+<td>2514</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2508</td></tr>
+<td>2515</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2509</td></tr>
+<td>2516</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2510</td></tr>
+<td>2517</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2511</td></tr>
+<td>2518</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 16, expected level should be one of the following: 18, 20.</td>
-<td>2512</td></tr>
+<td>2519</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 14, expected level should be one of the following: 16, 18.</td>
-<td>2514</td></tr>
+<td>2521</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2515</td></tr>
+<td>2522</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2516</td></tr>
+<td>2523</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 12, expected level should be one of the following: 14, 16.</td>
-<td>2517</td></tr>
+<td>2524</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>2518</td></tr>
+<td>2525</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2519</td></tr>
+<td>2526</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2521</td></tr>
+<td>2528</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2528</td></tr>
+<td>2535</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2529</td></tr>
+<td>2536</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2531</td></tr>
+<td>2538</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2533</td></tr>
+<td>2540</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2534</td></tr>
+<td>2541</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2536</td></tr>
+<td>2543</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2538</td></tr>
+<td>2545</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2539</td></tr>
+<td>2546</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2540</td></tr>
+<td>2547</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2550</td></tr>
+<td>2557</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2552</td></tr>
+<td>2559</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2554</td></tr>
+<td>2561</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2564</td></tr>
+<td>2571</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2565</td></tr>
+<td>2572</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2567</td></tr>
+<td>2574</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2569</td></tr>
+<td>2576</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2570</td></tr>
+<td>2577</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2572</td></tr>
+<td>2579</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2574</td></tr>
+<td>2581</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2575</td></tr>
+<td>2582</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2576</td></tr>
+<td>2583</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>2588</td></tr>
+<td>2595</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2673</td></tr>
+<td>2680</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2677</td></tr>
+<td>2684</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2679</td></tr>
+<td>2686</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>2681</td></tr>
+<td>2688</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>2682</td></tr>
+<td>2689</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>2683</td></tr>
+<td>2690</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3144</td></tr>
+<td>3151</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3320</td></tr>
+<td>3327</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3322</td></tr>
+<td>3329</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3415</td></tr>
+<td>3422</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>3445</td></tr>
+<td>3452</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3452</td></tr>
+<td>3459</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>3457</td></tr>
+<td>3464</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3486</td></tr>
+<td>3493</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
-<td>3584</td></tr></table></div>
+<td>3591</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</h3>
 <table border="0" class="table table-striped">
@@ -64146,13 +64146,13 @@
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>107</td></tr>
+<td>108</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>170</td></tr></table></div>
+<td>171</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.assignment.RegionStateStore.java">org/apache/hadoop/hbase/master/assignment/RegionStateStore.java</h3>
 <table border="0" class="table table-striped">
@@ -67509,7 +67509,7 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>148</td></tr></table></div>
+<td>127</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.master.procedure.MasterProcedureScheduler.java">org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.java</h3>
 <table border="0" class="table table-striped">
@@ -71490,61 +71490,61 @@
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 164 lines (max allowed is 150).</td>
-<td>460</td></tr>
+<td>498</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>590</td></tr>
+<td>628</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>596</td></tr>
+<td>634</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>822</td></tr>
+<td>860</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>823</td></tr>
+<td>861</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>842</td></tr>
+<td>880</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>851</td></tr>
+<td>889</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>873</td></tr>
+<td>911</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>876</td></tr>
+<td>914</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>1395</td></tr></table></div>
+<td>1433</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.ProcedureScheduler.java">org/apache/hadoop/hbase/procedure2/ProcedureScheduler.java</h3>
 <table border="0" class="table table-striped">
@@ -72006,7 +72006,7 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>128</td></tr></table></div>
+<td>146</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.java</h3>
 <table border="0" class="table table-striped">
@@ -72021,7 +72021,7 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>31</td></tr></table></div>
+<td>29</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.java</h3>
 <table border="0" class="table table-striped">
@@ -72036,13 +72036,13 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>65</td></tr>
+<td>66</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>231</td></tr></table></div>
+<td>232</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.store.TestProcedureStoreTracker.java">org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.java</h3>
 <table border="0" class="table table-striped">
@@ -72291,59 +72291,53 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>247</td></tr>
+<td>251</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>499</td></tr>
+<td>654</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>648</td></tr>
+<td>941</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>935</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1073</td></tr></table></div>
+<td>1079</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.util.DelayedUtil.java">org/apache/hadoop/hbase/procedure2/util/DelayedUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EqualsHashCode</td>
 <td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
 <td>62</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>136</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -72352,31 +72346,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.procedure2.util.StringUtils.java">org/apache/hadoop/hbase/procedure2/util/StringUtils.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>59</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>60</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -72385,25 +72379,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ProtobufMagic.java">org/apache/hadoop/hbase/protobuf/ProtobufMagic.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class ProtobufMagic should be declared as final.</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>43</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -72412,13 +72406,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ProtobufMessageConverter.java">org/apache/hadoop/hbase/protobuf/ProtobufMessageConverter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -72427,697 +72421,697 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/protobuf/ProtobufUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>189</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>264</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>294</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>314</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>333</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>334</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>335</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>336</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>337</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>339</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>340</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>341</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>342</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>343</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>344</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>354</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>355</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>357</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>358</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>359</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>360</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>361</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>362</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>363</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>364</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>365</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>374</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>377</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>455</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>458</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>468</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>471</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
 <td>500</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>570</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>573</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>583</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>586</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 117).</td>
 <td>652</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>670</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>691</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>705</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>708</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>728</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>734</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>748</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>767</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>769</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>852</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>954</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1058</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1129</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1130</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1132</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1183</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1185</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1197</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1198</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1200</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1227</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1228</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1298</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1340</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1343</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1363</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1369</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1403</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1460</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1462</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1467</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1468</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1469</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1470</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1471</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1473</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1474</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1475</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1485</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1490</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1491</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1492</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1493</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1494</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1495</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1496</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1497</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>1498</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>1499</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>1512</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>1550</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1666</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1680</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1681</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1682</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>1693</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
 <td>1694</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1695</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1696</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1697</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1698</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
 <td>1699</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
 <td>1700</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1733</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1734</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1735</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>1737</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1738</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73126,37 +73120,37 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.ReplicationProtbufUtil.java">org/apache/hadoop/hbase/protobuf/ReplicationProtbufUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
 <td>45</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>55</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>146</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73165,43 +73159,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.TestProtobufUtil.java">org/apache/hadoop/hbase/protobuf/TestProtobufUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>83</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>117</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>158</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>205</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>242</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -73210,19 +73204,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.protobuf.TestReplicationProtobuf.java">org/apache/hadoop/hbase/protobuf/TestReplicationProtobuf.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -73231,13 +73225,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.ActivePolicyEnforcement.java">org/apache/hadoop/hbase/quotas/ActivePolicyEnforcement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73246,13 +73240,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/AverageIntervalRateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -73261,31 +73255,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.DefaultOperationQuota.java">org/apache/hadoop/hbase/quotas/DefaultOperationQuota.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Mutation' import.</td>
 <td>28</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -73294,31 +73288,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.FileSystemUtilizationChore.java">org/apache/hadoop/hbase/quotas/FileSystemUtilizationChore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>44</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
 <td>47</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
 <td>50</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -73327,13 +73321,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.quotas.FixedIntervalRateLimiter.java">org/apache/hadoop/hbase/quotas/FixedIntervalRateLimiter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td

<TRUNCATED>

[44/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
index e7aae84..403b70e 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.76">ProcedureExecutor</a>&lt;TEnvironment&gt;
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.80">ProcedureExecutor</a>&lt;TEnvironment&gt;
 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">Thread Pool that executes the submitted procedures.
  The executor has a ProcedureStore associated.
@@ -231,88 +231,92 @@ 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/ProcedureExecutor.html#environment">environment</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/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#forceUpdateExecutor">forceUpdateExecutor</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#keepAliveTime">keepAliveTime</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/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#lastProcId">lastProcId</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#listeners">listeners</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/procedure2/ProcedureExecutor.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#maxPoolSize">maxPoolSize</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/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#nonceKeysToProcIdsMap">nonceKeysToProcIdsMap</a></span></code>
 <div class="block">Helper map to lookup whether the procedure already issued from the same client.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#procedures">procedures</a></span></code>
 <div class="block">Helper map to lookup the live procedures by ID.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#procExecutionLock">procExecutionLock</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#rollbackStack">rollbackStack</a></span></code>
 <div class="block">Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.</div>
 </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/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#running">running</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#scheduler">scheduler</a></span></code>
 <div class="block">Scheduler/Queue that contains runnable procedures.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#store">store</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.Testing</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#testing">testing</a></span></code>
 <div class="block"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#testing"><code>testing</code></a> is non-null when ProcedureExecutor is being tested.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#threadGroup">threadGroup</a></span></code>
 <div class="block">Created in the <code>#start(int, boolean)</code> method.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="class in org.apache.hadoop.hbase.procedure2">TimeoutExecutorThread</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#timeoutExecutor">timeoutExecutor</a></span></code>
 <div class="block">Created in the <code>#start(int, boolean)</code> method.</div>
 </td>
 </tr>
-<tr class="altColor">
+<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/ProcedureExecutor.html#WORKER_KEEP_ALIVE_TIME_CONF_KEY">WORKER_KEEP_ALIVE_TIME_CONF_KEY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#workerId">workerId</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/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.WorkerThread</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#workerThreads">workerThreads</a></span></code>
 <div class="block">Created in the <code>#start(int, boolean)</code> method.</div>
@@ -439,214 +443,218 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </td>
 </tr>
 <tr id="i13" class="rowColor">
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#forceUpdateProcedure-long-">forceUpdateProcedure</a></span>(long&nbsp;procId)</code>&nbsp;</td>
+</tr>
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getActiveExecutorCount--">getActiveExecutorCount</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getActiveProceduresNoCopy--">getActiveProceduresNoCopy</a></span>()</code>
 <div class="block">Should only be used when starting up, where the procedure workers have not been started.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getActiveProcIds--">getActiveProcIds</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getCorePoolSize--">getCorePoolSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getEnvironment--">getEnvironment</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getKeepAliveTime-java.util.concurrent.TimeUnit-">getKeepAliveTime</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;timeUnit)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>protected long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getLastProcId--">getLastProcId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>&lt;T 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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;<br>T</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getProcedure-java.lang.Class-long-">getProcedure</a></span>(<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;T&gt;&nbsp;clazz,
             long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code><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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getProcedure-long-">getProcedure</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code><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/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getProcedures--">getProcedures</a></span>()</code>
 <div class="block">Get procedures.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getProcedureScheduler--">getProcedureScheduler</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getProcStack-long-">getProcStack</a></span>(long&nbsp;rootProcId)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code><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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getResult-long-">getResult</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code><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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getResultOrProcedure-long-">getResultOrProcedure</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getRootProcedureId-org.apache.hadoop.hbase.procedure2.Procedure-">getRootProcedureId</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getScheduler--">getScheduler</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getStore--">getStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getWorkerThreadCount--">getWorkerThreadCount</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#handleInterruptedException-org.apache.hadoop.hbase.procedure2.Procedure-java.lang.InterruptedException-">handleInterruptedException</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
                           <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>&nbsp;e)</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#init-int-boolean-">init</a></span>(int&nbsp;numThreads,
     boolean&nbsp;abortOnCorruption)</code>
 <div class="block">Initialize the procedure executor, but do not start workers.</div>
 </td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>private <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#initializeChildren-org.apache.hadoop.hbase.procedure2.RootProcedureState-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">initializeChildren</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;procStack,
                   <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;procedure,
                   <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;subprocs)</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#isFinished-long-">isFinished</a></span>(long&nbsp;procId)</code>
 <div class="block">Return true if the procedure is finished.</div>
 </td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#isProcedureOwner-long-org.apache.hadoop.hbase.security.User-">isProcedureOwner</a></span>(long&nbsp;procId,
                 <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>
 <div class="block">Check if the user is this procedure's owner</div>
 </td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#isRunning--">isRunning</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#isStarted-long-">isStarted</a></span>(long&nbsp;procId)</code>
 <div class="block">Return true if the procedure is started.</div>
 </td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#join--">join</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#kill-java.lang.String-">kill</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#load-boolean-">load</a></span>(boolean&nbsp;abortOnCorruption)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#loadProcedures-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator-boolean-">loadProcedures</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter,
               boolean&nbsp;abortOnCorruption)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#nextProcId--">nextProcId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>private <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#prepareProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">prepareProcedure</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#procedureFinished-org.apache.hadoop.hbase.procedure2.Procedure-">procedureFinished</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>private long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#pushProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">pushProcedure</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#refreshConfiguration-org.apache.hadoop.conf.Configuration-">refreshConfiguration</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#registerListener-org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener-">registerListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#registerNonce-org.apache.hadoop.hbase.util.NonceKey-">registerNonce</a></span>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</code>
 <div class="block">Register a nonce for a procedure that is going to be submitted.</div>
 </td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#releaseLock-org.apache.hadoop.hbase.procedure2.Procedure-boolean-">releaseLock</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
            boolean&nbsp;force)</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#removeChore-org.apache.hadoop.hbase.procedure2.ProcedureInMemoryChore-">removeChore</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;chore)</code>
 <div class="block">Remove a chore procedure from the executor</div>
 </td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#removeResult-long-">removeResult</a></span>(long&nbsp;procId)</code>
 <div class="block">Mark the specified completed procedure, as ready to remove.</div>
 </td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#restoreLock-org.apache.hadoop.hbase.procedure2.Procedure-java.util.Set-">restoreLock</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;restored)</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#restoreLocks--">restoreLocks</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#restoreLocks-java.util.Deque-java.util.Set-">restoreLocks</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;&nbsp;stack,
             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;restored)</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#sendProcedureAddedNotification-long-">sendProcedureAddedNotification</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#sendProcedureFinishedNotification-long-">sendProcedureFinishedNotification</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#sendProcedureLoadedNotification-long-">sendProcedureLoadedNotification</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#setFailureResultForNonce-org.apache.hadoop.hbase.util.NonceKey-java.lang.String-org.apache.hadoop.hbase.security.User-java.io.IOException-">setFailureResultForNonce</a></span>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
                         <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;procName,
@@ -656,61 +664,61 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  same error to the requests with the same nonceKey.</div>
 </td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#setKeepAliveTime-long-java.util.concurrent.TimeUnit-">setKeepAliveTime</a></span>(long&nbsp;keepAliveTime,
                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;timeUnit)</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#startWorkers--">startWorkers</a></span>()</code>
 <div class="block">Start the workers.</div>
 </td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#stop--">stop</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#submitChildrenProcedures-org.apache.hadoop.hbase.procedure2.Procedure:A-">submitChildrenProcedures</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;subprocs)</code>&nbsp;</td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#submitProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">submitProcedure</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>
 <div class="block">Add a new root-procedure to the executor.</div>
 </td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#submitProcedure-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.util.NonceKey-">submitProcedure</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
                <a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</code>
 <div class="block">Add a new root-procedure to the executor.</div>
 </td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#submitProcedures-org.apache.hadoop.hbase.procedure2.Procedure:A-">submitProcedures</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;procs)</code>
 <div class="block">Add a set of new root-procedure to the executor.</div>
 </td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#unregisterListener-org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener-">unregisterListener</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#unregisterNonceIfProcedureWasNotSubmitted-org.apache.hadoop.hbase.util.NonceKey-">unregisterNonceIfProcedureWasNotSubmitted</a></span>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</code>
 <div class="block">Remove the NonceKey if the procedure was not submitted to the executor.</div>
 </td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#updateStoreOnExec-org.apache.hadoop.hbase.procedure2.RootProcedureState-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">updateStoreOnExec</a></span>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;procStack,
                  <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;procedure,
                  <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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;[]&nbsp;subprocs)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#yieldProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">yieldProcedure</a></span>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc)</code>&nbsp;</td>
 </tr>
@@ -742,7 +750,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/procedure2/ProcedureExecutor.html#line.77">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.81">LOG</a></pre>
 </li>
 </ul>
 <a name="CHECK_OWNER_SET_CONF_KEY">
@@ -751,7 +759,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CHECK_OWNER_SET_CONF_KEY</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/ProcedureExecutor.html#line.79">CHECK_OWNER_SET_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.83">CHECK_OWNER_SET_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CHECK_OWNER_SET_CONF_KEY">Constant Field Values</a></dd>
@@ -764,7 +772,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_CHECK_OWNER_SET</h4>
-<pre>private static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.80">DEFAULT_CHECK_OWNER_SET</a></pre>
+<pre>private static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.84">DEFAULT_CHECK_OWNER_SET</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.DEFAULT_CHECK_OWNER_SET">Constant Field Values</a></dd>
@@ -777,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WORKER_KEEP_ALIVE_TIME_CONF_KEY</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/ProcedureExecutor.html#line.82">WORKER_KEEP_ALIVE_TIME_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.86">WORKER_KEEP_ALIVE_TIME_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WORKER_KEEP_ALIVE_TIME_CONF_KEY">Constant Field Values</a></dd>
@@ -790,7 +798,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WORKER_KEEP_ALIVE_TIME</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.84">DEFAULT_WORKER_KEEP_ALIVE_TIME</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.88">DEFAULT_WORKER_KEEP_ALIVE_TIME</a></pre>
 </li>
 </ul>
 <a name="testing">
@@ -799,7 +807,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testing</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.Testing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.91">testing</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.Testing</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.95">testing</a></pre>
 <div class="block"><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#testing"><code>testing</code></a> is non-null when ProcedureExecutor is being tested. Tests will try to
  break PE having it fail at various junctures. When non-null, testing is set to an instance of
  the below internal <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html" title="class in org.apache.hadoop.hbase.procedure2"><code>ProcedureExecutor.Testing</code></a> class with flags set for the particular test.</div>
@@ -811,7 +819,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>completed</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.287">completed</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.291">completed</a></pre>
 <div class="block">Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.
  Once a Root-Procedure completes (success or failure), the result will be added to this map.
  The user of ProcedureExecutor should call getResult(procId) to get the result.</div>
@@ -823,7 +831,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rollbackStack</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.295">rollbackStack</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.html" title="class in org.apache.hadoop.hbase.procedure2">RootProcedureState</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.299">rollbackStack</a></pre>
 <div class="block">Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.
  The RootProcedureState contains the execution stack of the Root-Procedure,
  It is added to the map by submitProcedure() and removed on procedure completion.</div>
@@ -835,7 +843,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procedures</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.302">procedures</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.306">procedures</a></pre>
 <div class="block">Helper map to lookup the live procedures by ID.
  This map contains every procedure. root-procedures and subprocedures.</div>
 </li>
@@ -846,7 +854,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nonceKeysToProcIdsMap</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.309">nonceKeysToProcIdsMap</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentHashMap</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.313">nonceKeysToProcIdsMap</a></pre>
 <div class="block">Helper map to lookup whether the procedure already issued from the same client. This map
  contains every root procedure.</div>
 </li>
@@ -857,7 +865,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>listeners</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.311">listeners</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.315">listeners</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -866,7 +874,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.314">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.318">conf</a></pre>
 </li>
 </ul>
 <a name="threadGroup">
@@ -875,7 +883,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>threadGroup</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.322">threadGroup</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.326">threadGroup</a></pre>
 <div class="block">Created in the <code>#start(int, boolean)</code> method. Destroyed in <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#join--"><code>join()</code></a> (FIX! Doing
  resource handling rather than observing in a #join is unexpected).
  Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery
@@ -888,7 +896,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>workerThreads</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.WorkerThread</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.330">workerThreads</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.WorkerThread</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.334">workerThreads</a></pre>
 <div class="block">Created in the <code>#start(int, boolean)</code> method. Terminated in <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#join--"><code>join()</code></a> (FIX! Doing
  resource handling rather than observing in a #join is unexpected).
  Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery
@@ -901,7 +909,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>timeoutExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="class in org.apache.hadoop.hbase.procedure2">TimeoutExecutorThread</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.338">timeoutExecutor</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/TimeoutExecutorThread.html" title="class in org.apache.hadoop.hbase.procedure2">TimeoutExecutorThread</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.342">timeoutExecutor</a></pre>
 <div class="block">Created in the <code>#start(int, boolean)</code> method. Terminated in <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#join--"><code>join()</code></a> (FIX! Doing
  resource handling rather than observing in a #join is unexpected).
  Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery
@@ -914,7 +922,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>corePoolSize</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.340">corePoolSize</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.344">corePoolSize</a></pre>
 </li>
 </ul>
 <a name="maxPoolSize">
@@ -923,7 +931,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>maxPoolSize</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.341">maxPoolSize</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.345">maxPoolSize</a></pre>
 </li>
 </ul>
 <a name="keepAliveTime">
@@ -932,7 +940,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>keepAliveTime</h4>
-<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.343">keepAliveTime</a></pre>
+<pre>private volatile&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.347">keepAliveTime</a></pre>
 </li>
 </ul>
 <a name="scheduler">
@@ -941,17 +949,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scheduler</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.348">scheduler</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.352">scheduler</a></pre>
 <div class="block">Scheduler/Queue that contains runnable procedures.</div>
 </li>
 </ul>
+<a name="forceUpdateExecutor">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>forceUpdateExecutor</h4>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executor.html?is-external=true" title="class or interface in java.util.concurrent">Executor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.354">forceUpdateExecutor</a></pre>
+</li>
+</ul>
 <a name="lastProcId">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>lastProcId</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.350">lastProcId</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.357">lastProcId</a></pre>
 </li>
 </ul>
 <a name="workerId">
@@ -960,7 +977,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>workerId</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.351">workerId</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.358">workerId</a></pre>
 </li>
 </ul>
 <a name="activeExecutorCount">
@@ -969,7 +986,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>activeExecutorCount</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.352">activeExecutorCount</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.359">activeExecutorCount</a></pre>
 </li>
 </ul>
 <a name="running">
@@ -978,7 +995,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>running</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.353">running</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.360">running</a></pre>
 </li>
 </ul>
 <a name="environment">
@@ -987,7 +1004,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>environment</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.354">environment</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.361">environment</a></pre>
 </li>
 </ul>
 <a name="store">
@@ -996,7 +1013,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>store</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.355">store</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.362">store</a></pre>
 </li>
 </ul>
 <a name="checkOwnerSet">
@@ -1005,7 +1022,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOwnerSet</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.357">checkOwnerSet</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.364">checkOwnerSet</a></pre>
 </li>
 </ul>
 <a name="procExecutionLock">
@@ -1014,7 +1031,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>procExecutionLock</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.365">procExecutionLock</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.372">procExecutionLock</a></pre>
 </li>
 </ul>
 </li>
@@ -1033,7 +1050,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ProcedureExecutor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.367">ProcedureExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.374">ProcedureExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&nbsp;environment,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;store)</pre>
 </li>
@@ -1046,7 +1063,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ProcedureExecutor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.372">ProcedureExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.398">ProcedureExecutor</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&nbsp;environment,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;store,
                          <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a>&nbsp;scheduler)</pre>
@@ -1060,13 +1077,27 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="forceUpdateProcedure-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>forceUpdateProcedure</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.379">forceUpdateProcedure</a>(long&nbsp;procId)
+                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
 <a name="load-boolean-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.383">load</a>(boolean&nbsp;abortOnCorruption)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.421">load</a>(boolean&nbsp;abortOnCorruption)
            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>
@@ -1080,7 +1111,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreLock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.416">restoreLock</a>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.454">restoreLock</a>(<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;proc,
                          <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;restored)</pre>
 </li>
 </ul>
@@ -1090,7 +1121,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreLocks</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.421">restoreLocks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;&nbsp;stack,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.459">restoreLocks</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Deque.html?is-external=true" title="class or interface in java.util">Deque</a>&lt;<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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&gt;&nbsp;stack,
                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;restored)</pre>
 </li>
 </ul>
@@ -1100,7 +1131,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>restoreLocks</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.440">restoreLocks</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.478">restoreLocks</a>()</pre>
 </li>
 </ul>
 <a name="loadProcedures-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator-boolean-">
@@ -1109,7 +1140,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>loadProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.460">loadProcedures</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.498">loadProcedures</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter,
                             boolean&nbsp;abortOnCorruption)
                      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>
@@ -1124,7 +1155,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.636">init</a>(int&nbsp;numThreads,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.674">init</a>(int&nbsp;numThreads,
                  boolean&nbsp;abortOnCorruption)
           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">Initialize the procedure executor, but do not start workers. We will start them later.
@@ -1148,7 +1179,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startWorkers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.681">startWorkers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.719">startWorkers</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Start the workers.</div>
 <dl>
@@ -1163,7 +1194,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.700">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.738">stop</a>()</pre>
 </li>
 </ul>
 <a name="join--">
@@ -1172,7 +1203,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>join</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.711">join</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.749">join</a>()</pre>
 </li>
 </ul>
 <a name="refreshConfiguration-org.apache.hadoop.conf.Configuration-">
@@ -1181,7 +1212,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshConfiguration</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.742">refreshConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.780">refreshConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="isRunning--">
@@ -1190,7 +1221,7 @@ extends <a href="h

<TRUNCATED>

[24/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineN

<TRUNCATED>

[14/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
index e1b183b..b456cd2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html
@@ -53,1338 +53,1354 @@
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
 <span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.46"></a>
 <span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * WAL implementation of the ProcedureStore.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;p/&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * then {@link #load(ProcedureLoader)}.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;p/&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * the old wal files.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * the races if there are two master both wants to acquire the lease...<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;p/&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * comments of this method for more details.<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * &lt;p/&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> * &lt;p/&gt;<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;p/&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * the modified procedures for the new wal file.<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p/&gt;<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * with the tracker of every newer wal files, using the<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.100"></a>
-<span class="sourceLineNo">101</span> * files, then we can delete it.<a name="line.101"></a>
-<span class="sourceLineNo">102</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.102"></a>
-<span class="sourceLineNo">103</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.103"></a>
-<span class="sourceLineNo">104</span> */<a name="line.104"></a>
-<span class="sourceLineNo">105</span>@InterfaceAudience.Private<a name="line.105"></a>
-<span class="sourceLineNo">106</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public interface LeaseRecovery {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<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> * WAL implementation of the ProcedureStore.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p/&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * then {@link #load(ProcedureLoader)}.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;p/&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the old wal files.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * the races if there are two master both wants to acquire the lease...<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;p/&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * comments of this method for more details.<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;p/&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;p/&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;p/&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * the modified procedures for the new wal file.<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;p/&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * with the tracker of every newer wal files, using the<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.101"></a>
+<span class="sourceLineNo">102</span> * files, then we can delete it. This is because that, every time we call<a name="line.102"></a>
+<span class="sourceLineNo">103</span> * {@link ProcedureStore#insert(Procedure[])} or {@link ProcedureStore#update(Procedure)}, we will<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * persist the full state of a Procedure, so the earlier wal records for this procedure can all be<a name="line.104"></a>
+<span class="sourceLineNo">105</span> * deleted.<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.Private<a name="line.109"></a>
+<span class="sourceLineNo">110</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 64;<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  public interface LeaseRecovery {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<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>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.123"></a>
+<span class="sourceLineNo">121</span>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 10;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.127"></a>
+<span class="sourceLineNo">125</span>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.131"></a>
+<span class="sourceLineNo">129</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.131"></a>
 <span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.135"></a>
+<span class="sourceLineNo">133</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.135"></a>
 <span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.139"></a>
+<span class="sourceLineNo">137</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.143"></a>
+<span class="sourceLineNo">141</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.143"></a>
 <span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.156"></a>
+<span class="sourceLineNo">145</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.156"></a>
 <span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private final Condition waitCond = lock.newCondition();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  private final Condition slotCond = lock.newCondition();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private final Condition syncCond = lock.newCondition();<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  private final LeaseRecovery leaseRecovery;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final Configuration conf;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private final FileSystem fs;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private final Path walDir;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private final Path walArchiveDir;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  private final boolean enforceStreamCapability;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private FSDataOutputStream stream = null;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  private int runningProcCount = 1;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private long flushLogId = 0;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private int syncMaxSlot = 1;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private int slotIndex = 0;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private Thread syncThread;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ByteSlot[] slots;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private int walCountWarnThreshold;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private int maxRetriesBeforeRoll;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private int maxSyncFailureRoll;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  private int waitBeforeRoll;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private int rollRetries;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private int periodicRollMsec;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  private long rollThreshold;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private boolean useHsync;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private int syncWaitMsec;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // Variables used for UI display<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  public static class SyncMetrics {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private long timestamp;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    private long syncWaitMs;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private long totalSyncedBytes;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private int syncedEntries;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    private float syncedPerSec;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>    public long getTimestamp() {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      return timestamp;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">158</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  private final Condition waitCond = lock.newCondition();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private final Condition slotCond = lock.newCondition();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  private final Condition syncCond = lock.newCondition();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  private final LeaseRecovery leaseRecovery;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private final Configuration conf;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  private final FileSystem fs;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private final Path walDir;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private final Path walArchiveDir;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  private final boolean enforceStreamCapability;<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private FSDataOutputStream stream = null;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  private int runningProcCount = 1;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  private long flushLogId = 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private int syncMaxSlot = 1;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private int slotIndex = 0;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private Thread syncThread;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  private ByteSlot[] slots;<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private int walCountWarnThreshold;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private int maxRetriesBeforeRoll;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private int maxSyncFailureRoll;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private int waitBeforeRoll;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private int rollRetries;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private int periodicRollMsec;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private long rollThreshold;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private boolean useHsync;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private int syncWaitMsec;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  // Variables used for UI display<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  public static class SyncMetrics {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private long timestamp;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    private long syncWaitMs;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private long totalSyncedBytes;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private int syncedEntries;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    private float syncedPerSec;<a name="line.212"></a>
 <span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public long getSyncWaitMs() {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      return syncWaitMs;<a name="line.215"></a>
+<span class="sourceLineNo">214</span>    public long getTimestamp() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return timestamp;<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>    public long getTotalSyncedBytes() {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      return totalSyncedBytes;<a name="line.219"></a>
+<span class="sourceLineNo">218</span>    public long getSyncWaitMs() {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return syncWaitMs;<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>    public long getSyncedEntries() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return syncedEntries;<a name="line.223"></a>
+<span class="sourceLineNo">222</span>    public long getTotalSyncedBytes() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return totalSyncedBytes;<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>    public float getSyncedPerSec() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return syncedPerSec;<a name="line.227"></a>
+<span class="sourceLineNo">226</span>    public long getSyncedEntries() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return syncedEntries;<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this(conf,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        leaseRecovery);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @VisibleForTesting<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    this.conf = conf;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.leaseRecovery = leaseRecovery;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.walDir = walDir;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.walArchiveDir = walArchiveDir;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    this.fs = walDir.getFileSystem(conf);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Create the log directory for the procedure store<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (!fs.exists(walDir)) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      if (!fs.mkdirs(walDir)) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Now that it exists, set the log policy<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    String storagePolicy =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>
-<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public void start(int numSlots) throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    if (!setRunning(true)) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // Init buffer slots<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    loading.set(true);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    runningProcCount = numSlots;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    syncMaxSlot = numSlots;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    slots = new ByteSlot[numSlots];<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      slotsCache.offer(new ByteSlot());<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>    // Tunings<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    walCountWarnThreshold =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    maxRetriesBeforeRoll =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // WebUI<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.301"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    public float getSyncedPerSec() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return syncedPerSec;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this(conf,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        leaseRecovery);<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>  @VisibleForTesting<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    this.conf = conf;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    this.leaseRecovery = leaseRecovery;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.walDir = walDir;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.walArchiveDir = walArchiveDir;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.fs = walDir.getFileSystem(conf);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Create the log directory for the procedure store<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (!fs.exists(walDir)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (!fs.mkdirs(walDir)) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Unable to mkdir " + walDir);<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>    // Now that it exists, set the log policy<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    String storagePolicy =<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      } else {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>  }<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void start(int numSlots) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    if (!setRunning(true)) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      return;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Init buffer slots<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    loading.set(true);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    runningProcCount = numSlots;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    syncMaxSlot = numSlots;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    slots = new ByteSlot[numSlots];<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      slotsCache.offer(new ByteSlot());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // Tunings<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    walCountWarnThreshold =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    maxRetriesBeforeRoll =<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.301"></a>
 <span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // Init sync thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      @Override<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      public void run() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          syncLoop();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        } catch (Throwable e) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          if (!isSyncAborted()) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            sendAbortProcessSignal();<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>    };<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    syncThread.start();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(final boolean abort) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!setRunning(false)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    sendStopSignal();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (!isSyncAborted()) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        while (syncThread.isAlive()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          sendStopSignal();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          syncThread.join(250);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      } catch (InterruptedException e) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        LOG.warn("join interrupted", e);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        Thread.currentThread().interrupt();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Close the writer<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    closeCurrentLogStream();<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Close the old logs<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    // they should be already closed, this is just in case the load fails<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // and we call start() and then stop()<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (ProcedureWALFile log: logs) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      log.close();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    logs.clear();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    loading.set(true);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void sendStopSignal() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (lock.tryLock()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      try {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        waitCond.signalAll();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        syncCond.signalAll();<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      } finally {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        lock.unlock();<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>  }<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>  public int getNumThreads() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    return slots == null ? 0 : slots.length;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Override<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public int setRunningProcedureCount(final int count) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return this.runningProcCount;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return storeTracker;<a name="line.377"></a>
+<span class="sourceLineNo">303</span>    // WebUI<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Init sync thread<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      public void run() {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          syncLoop();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        } catch (Throwable e) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if (!isSyncAborted()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            sendAbortProcessSignal();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          }<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    };<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    syncThread.start();<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void stop(final boolean abort) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (!setRunning(false)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    sendStopSignal();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (!isSyncAborted()) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        while (syncThread.isAlive()) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          sendStopSignal();<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          syncThread.join(250);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      } catch (InterruptedException e) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        LOG.warn("join interrupted", e);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Close the writer<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    closeCurrentLogStream();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Close the old logs<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // they should be already closed, this is just in case the load fails<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // and we call start() and then stop()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    for (ProcedureWALFile log: logs) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      log.close();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    logs.clear();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    loading.set(true);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private void sendStopSignal() {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    if (lock.tryLock()) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        waitCond.signalAll();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        syncCond.signalAll();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      } finally {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        lock.unlock();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public int getNumThreads() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return slots == null ? 0 : slots.length;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  @Override<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public int setRunningProcedureCount(final int count) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    return this.runningProcCount;<a name="line.377"></a>
 <span class="sourceLineNo">378</span>  }<a name="line.378"></a>
 <span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    lock.lock();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    try {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new ArrayList&lt;&gt;(logs);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    } finally {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      lock.unlock();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return corruptedLogs;<a name="line.390"></a>
+<span class="sourceLineNo">380</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    return storeTracker;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    lock.lock();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new ArrayList&lt;&gt;(logs);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } finally {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      lock.unlock();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
 <span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public void recoverLease() throws IOException {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    lock.lock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      boolean afterFirstAttempt = false;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      while (isRunning()) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        // Don't sleep before first attempt<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (afterFirstAttempt) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              waitBeforeRoll);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        } else {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          afterFirstAttempt = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        // Get Log-MaxID and recover lease on old logs<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          flushLogId = initOldLogs(oldLogs);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        } catch (FileNotFoundException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          continue;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Create new state-log<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          // someone else has already created this log<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          continue;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // We have the lease on the log<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        oldLogs = getLogFiles();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      lock.unlock();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    lock.lock();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    try {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      if (logs.isEmpty()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // Nothing to do, If we have only the current log.<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (logs.size() == 1) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        LOG.trace("No state logs to replay.");<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        loader.setMaxProcId(0);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        return;<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>      // Load the old logs<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      it.next(); // Skip the current log<a name="line.457"></a>
+<span class="sourceLineNo">393</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    return corruptedLogs;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public void recoverLease() throws IOException {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    lock.lock();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    try {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      boolean afterFirstAttempt = false;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      while (isRunning()) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // Don't sleep before first attempt<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (afterFirstAttempt) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.406"></a>
+<span class="sourceLineNo">407</span>              waitBeforeRoll);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          afterFirstAttempt = true;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        // Get Log-MaxID and recover lease on old logs<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          flushLogId = initOldLogs(oldLogs);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (FileNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          continue;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // Create new state-log<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          // someone else has already created this log<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // We have the lease on the log<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        oldLogs = getLogFiles();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        break;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    } finally {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      lock.unlock();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    lock.lock();<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (logs.isEmpty()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        throw new RuntimeException("recoverLease() must be called before loading data");<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>      // Nothing to do, If we have only the current log.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (logs.size() == 1) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        LOG.trace("No state logs to replay.");<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        loader.setMaxProcId(0);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>        @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        public void setMaxProcId(long maxProcId) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          loader.load(procIter);<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>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          loader.handleCorrupted(procIter);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>        @Override<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          if (corruptedLogs == null) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          corruptedLogs.add(log);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // TODO: sideline corrupted log<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      });<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    } finally {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      try {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // try to cleanup inactive wals and complete the operation<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        buildHoldingCleanupTracker();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        tryCleanupLogsOnLoad();<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        loading.set(false);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      } finally {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        lock.unlock();<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>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  private void tryCleanupLogsOnLoad() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // nothing to cleanup.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (logs.size() &lt;= 1) return;<a name="line.499"></a>
+<span class="sourceLineNo">459</span>      // Load the old logs<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      it.next(); // Skip the current log<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        @Override<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        public void setMaxProcId(long maxProcId) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          loader.load(procIter);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>        @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          loader.handleCorrupted(procIter);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>        @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          if (corruptedLogs == null) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>          corruptedLogs.add(log);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          // TODO: sideline corrupted log<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      });<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    } finally {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      try {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        // try to cleanup inactive wals and complete the operation<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        buildHoldingCleanupTracker();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        tryCleanupLogsOnLoad();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        loading.set(false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      } finally {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        lock.unlock();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
 <span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    // the config says to not cleanup wals on load.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return;<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>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      periodicRoll();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    } catch (IOException e) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.511"></a>
+<span class="sourceLineNo">501</span>  private void tryCleanupLogsOnLoad() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    // nothing to cleanup.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (logs.size() &lt;= 1) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return;<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>    // the config says to not cleanup wals on load.<a name="line.507"></a>
+<span class="sourceLineNo">508</

<TRUNCATED>

[11/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
index f9d05cb..67f0fc6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
@@ -31,316 +31,325 @@
 <span class="sourceLineNo">023</span>import java.lang.reflect.Constructor;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.lang.reflect.InvocationTargetException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> */<a name="line.37"></a>
-<span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class JVMClusterUtil {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  public static class RegionServerThread extends Thread {<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final HRegionServer regionServer;<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.49"></a>
-<span class="sourceLineNo">050</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public HRegionServer getRegionServer() {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.59"></a>
-<span class="sourceLineNo">060</span>     * to be used.<a name="line.60"></a>
-<span class="sourceLineNo">061</span>     */<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    public void waitForServerOnline() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      // The server is marked online after the init method completes inside of<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      regionServer.waitForServerOnline();<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<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>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Creates a {@link RegionServerThread}.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * Call 'start' on the returned thread to make it run.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * @param c Configuration to use.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * @param hrsc Class to create.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @param index Used distinguishing the object returned.<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @throws IOException<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * @return Region server added.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    HRegionServer server;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    try {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ctor.setAccessible(true);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      server = ctor.newInstance(c);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    } catch (InvocationTargetException ite) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      Throwable target = ite.getTargetException();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          target.getCause().getMessage(): ""), target);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    } catch (Exception e) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      IOException ioe = new IOException();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      ioe.initCause(e);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      throw ioe;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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">026</span>import java.util.concurrent.TimeUnit;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.function.Supplier;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<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 JVMClusterUtil {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public static class RegionServerThread extends Thread {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final HRegionServer regionServer;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.50"></a>
+<span class="sourceLineNo">051</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    public HRegionServer getRegionServer() {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * to be used.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    public void waitForServerOnline() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      // The server is marked online after the init method completes inside of<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      regionServer.waitForServerOnline();<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><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Creates a {@link RegionServerThread}.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Call 'start' on the returned thread to make it run.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param c Configuration to use.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @param hrsc Class to create.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @param index Used distinguishing the object returned.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @throws IOException<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return Region server added.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    HRegionServer server;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    try {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ctor.setAccessible(true);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      server = ctor.newInstance(c);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    } catch (InvocationTargetException ite) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      Throwable target = ite.getTargetException();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          target.getCause().getMessage(): ""), target);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    } catch (Exception e) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      IOException ioe = new IOException();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      ioe.initCause(e);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      throw ioe;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * Datastructure to hold Master Thread and Master instance<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public static class MasterThread extends Thread {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private final HMaster master;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public MasterThread(final HMaster m, final int index) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.master = m;<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>    /** @return the master */<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public HMaster getMaster() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return this.master;<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><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * Creates a {@link MasterThread}.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Call 'start' on the returned thread to make it run.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param c Configuration to use.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @param hmc Class to create.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * @param index Used distinguishing the object returned.<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @throws IOException<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return Master added.<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    HMaster server;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    try {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    } catch (InvocationTargetException ite) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      Throwable target = ite.getTargetException();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          target.getCause().getMessage(): ""), target);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    } catch (Exception e) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      IOException ioe = new IOException();<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      ioe.initCause(e);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      throw ioe;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      if (t.master.isActiveMaster()) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        return t;<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>    return null;<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>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * and returns its address.<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param masters<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @param regionservers<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * @return Address to use contacting primary master.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>    Configuration configuration = null;<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    if (masters == null || masters.isEmpty()) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      configuration = t.getMaster().getConfiguration();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      t.start();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // Wait for an active master<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    //  having an active master before starting the region threads allows<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    //  then to succeed on their connection to master<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    long startTime = System.currentTimeMillis();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    while (findActiveMaster(masters) == null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        Thread.sleep(100);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      } catch (InterruptedException e) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      int startTimeout = configuration != null ? Integer.parseInt(<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (System.currentTimeMillis() &gt; startTime + startTimeout) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        String msg = "Master not active after " + startTimeout + "ms";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        throw new RuntimeException(msg);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    if (regionservers != null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        t.start();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // Wait for an active master to be initialized (implies being master)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    //  with this, when we return the cluster is complete<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    startTime = System.currentTimeMillis();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    final int maxwait = 200000;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    while (true) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      if (t != null &amp;&amp; t.master.isInitialized()) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        return t.master.getServerName().toString();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      // REMOVE<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      if (System.currentTimeMillis() &gt; startTime + 10000) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          Thread.sleep(1000);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        } catch (InterruptedException e) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (System.currentTimeMillis() &gt; startTime + maxwait) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        String msg = "Master not initialized after " + maxwait + "ms seconds";<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        throw new RuntimeException(msg);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      try {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        Thread.sleep(100);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      } catch (InterruptedException e) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<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>  }<a name="line.230"></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>   * Datastructure to hold Master Thread and Master instance<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static class MasterThread extends Thread {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    private final HMaster master;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public MasterThread(final HMaster m, final int index) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      this.master = m;<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>    /** @return the master */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    public HMaster getMaster() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      return this.master;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Creates a {@link MasterThread}.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Call 'start' on the returned thread to make it run.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param c Configuration to use.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * @param hmc Class to create.<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * @param index Used distinguishing the object returned.<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @throws IOException<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * @return Master added.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    HMaster server;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    } catch (InvocationTargetException ite) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      Throwable target = ite.getTargetException();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          target.getCause().getMessage(): ""), target);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    } catch (Exception e) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      IOException ioe = new IOException();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      ioe.initCause(e);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      throw ioe;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      if (t.master.isActiveMaster()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        return t;<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><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return null;<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">158</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * and returns its address.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * @param masters<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * @param regionservers<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @return Address to use contacting primary master.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Implementation note: This method relies on timed sleeps in a loop. It's not great, and<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    // should probably be re-written to use actual synchronization objects, but it's ok for now<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Configuration configuration = null;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    if (masters == null || masters.isEmpty()) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      configuration = t.getMaster().getConfiguration();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      t.start();<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>    // Wait for an active master<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    //  having an active master before starting the region threads allows<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    //  then to succeed on their connection to master<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final int startTimeout = configuration != null ? Integer.parseInt(<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    waitForEvent(startTimeout, "active", () -&gt; findActiveMaster(masters) != null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (regionservers != null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        t.start();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>    // Wait for an active master to be initialized (implies being master)<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    //  with this, when we return the cluster is complete<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final int initTimeout = configuration != null ? Integer.parseInt(<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        configuration.get("hbase.master.init.timeout.localHBaseCluster", "200000")) : 200000;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    waitForEvent(initTimeout, "initialized", () -&gt; {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        // master thread should never be null at this point, but let's keep the check anyway<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        return t != null &amp;&amp; t.master.isInitialized();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    );<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return findActiveMaster(masters).master.getServerName().toString();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Utility method to wait some time for an event to occur, and then return control to the caller.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param millis How long to wait, in milliseconds.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @param action The action that we are waiting for. Will be used in log message if the event<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   *               does not occur.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param check A Supplier that will be checked periodically to produce an updated true/false<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   *              result indicating if the expected event has happened or not.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @throws InterruptedIOException If we are interrupted while waiting for the event.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @throws RuntimeException If we reach the specified timeout while waiting for the event.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  private static void waitForEvent(long millis, String action, Supplier&lt;Boolean&gt; check)<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      throws InterruptedIOException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    long end = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(millis);<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    while (true) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      if (check.get()) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        return;<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>      if (System.nanoTime() &gt; end) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        String msg = "Master not " + action + " after " + millis + "ms";<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        throw new RuntimeException(msg);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
 <span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param masters<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param regionservers<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (masters != null) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      // Do backups first.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        if (!t.master.isActiveMaster()) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          try {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            t.master.stopMaster();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          } catch (IOException e) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        } else {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          activeMaster = t;<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>      // Do active after.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      if (activeMaster != null) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        try {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          activeMaster.master.shutdown();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (IOException e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    boolean wasInterrupted = false;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (regionservers != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      // first try nicely.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      for (RegionServerThread t : regionservers) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionServerThread t : regionservers) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        long now = System.currentTimeMillis();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            t.join(maxTime - now);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          } catch (InterruptedException e) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.275"></a>
-<span class="sourceLineNo">276</span>                "not waiting anymore on region server ends", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          }<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>      // Let's try to interrupt the remaining threads if any.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        boolean atLeastOneLiveServer = false;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        for (RegionServerThread t : regionservers) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          if (t.isAlive()) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            atLeastOneLiveServer = true;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              t.join(1000);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>              wasInterrupted = true;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        if (!atLeastOneLiveServer) break;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        for (RegionServerThread t : regionservers) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (t.isAlive()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              "if &gt; 3 attempts: i=" + i);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            if (i &gt; 3) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            t.interrupt();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (masters != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.314"></a>
-<span class="sourceLineNo">315</span>            // tests.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>            // this.master.join():<a name="line.316"></a>
-<span class="sourceLineNo">317</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          } catch(InterruptedException e) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.319"></a>
-<span class="sourceLineNo">320</span>                "not waiting anymore on master ends", e);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>            wasInterrupted = true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Shutdown of " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (wasInterrupted){<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Thread.currentThread().interrupt();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>}<a name="line.335"></a>
+<span class="sourceLineNo">232</span>      try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        Thread.sleep(100);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      } catch (InterruptedException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<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>   * @param masters<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param regionservers<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (masters != null) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // Do backups first.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        if (!t.master.isActiveMaster()) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            t.master.stopMaster();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          activeMaster = t;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      // Do active after.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (activeMaster != null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          activeMaster.master.shutdown();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        } catch (IOException e) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<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>    boolean wasInterrupted = false;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    if (regionservers != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      // first try nicely.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      for (RegionServerThread t : regionservers) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      for (RegionServerThread t : regionservers) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        long now = System.currentTimeMillis();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            t.join(maxTime - now);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          } catch (InterruptedException e) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                "not waiting anymore on region server ends", e);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>      // Let's try to interrupt the remaining threads if any.<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        boolean atLeastOneLiveServer = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        for (RegionServerThread t : regionservers) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          if (t.isAlive()) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            atLeastOneLiveServer = true;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.298"></a>
+<span class="sourceLineNo">299</span>              t.join(1000);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            } catch (InterruptedException e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              wasInterrupted = true;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        if (!atLeastOneLiveServer) break;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        for (RegionServerThread t : regionservers) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          if (t.isAlive()) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.308"></a>
+<span class="sourceLineNo">309</span>              "if &gt; 3 attempts: i=" + i);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            if (i &gt; 3) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>            t.interrupt();<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>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    if (masters != null) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          try {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            // tests.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            // this.master.join():<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          } catch(InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.328"></a>
+<span class="sourceLineNo">329</span>                "not waiting anymore on master ends", e);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            wasInterrupted = true;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    LOG.info("Shutdown of " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (wasInterrupted){<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>}<a name="line.344"></a>
 
 
 


[33/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
index 721035e..f808b16 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.html
@@ -169,3778 +169,3785 @@
 <span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.161"></a>
 <span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.quotas.MasterQuotasObserver;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.quotas.QuotaObserverChore;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.regionserver.RSRpcServices;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.replication.ReplicationLoadSource;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
-<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
-<span class="sourceLineNo">242</span> *<a name="line.242"></a>
-<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> *<a name="line.246"></a>
-<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
-<span class="sourceLineNo">248</span> *<a name="line.248"></a>
-<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
-<span class="sourceLineNo">250</span> */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
-<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<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>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.setDaemon(true);<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>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  //Tracker for master maintenance mode setting<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  private ClusterSchemaService clusterSchemaService;<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    "hbase.master.wait.on.service.seconds";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  // Metrics for the HMaster<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  final MetricsMaster metricsMaster;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // file system manager for the master FS operations<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private MasterFileSystem fileSystemManager;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterWalManager walManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // server manager to deal with region server info<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private volatile ServerManager serverManager;<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // manager of assignment nodes in zookeeper<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private AssignmentManager assignmentManager;<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  // manager of replication<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  // buffer for "fatal error" notices from region servers<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // in the cluster. This is only used for assisting<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // operations/debugging.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // flag set after we become the active master (used for testing)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private volatile boolean activeMaster = false;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  // flag set after we complete initialization once active<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  // flag set after master services are started,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // initialization may have not completed yet.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  volatile boolean serviceStarted = false;<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Maximum time we should run balancer for<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  private final int maxBlancingTime;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Maximum percent of regions in transition when balancing<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  private final double maxRitPercent;<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private final LockManager lockManager = new LockManager(this);<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private LoadBalancer balancer;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private RegionNormalizer normalizer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private BalancerChore balancerChore;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private RegionNormalizerChore normalizerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private ClusterStatusChore clusterStatusChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  CatalogJanitor catalogJanitorChore;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private LogCleaner logCleaner;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private HFileCleaner hfileCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private MobCompactionChore mobCompactChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // used to synchronize the mobCompactionStates<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // save the information of mob compactions in tables.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  MasterCoprocessorHost cpHost;<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  private final boolean preLoadTableDescriptors;<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // Time stamps for when a hmaster became active<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  private long masterActiveTime;<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  private long masterFinishedInitializationTime;<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private final boolean masterCheckCompression;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  //should we check encryption settings at master side, default true<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private final boolean masterCheckEncryption;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // monitor for snapshot of hbase tables<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  SnapshotManager snapshotManager;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // monitor for distributed procedures<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private MasterProcedureManagerHost mpmHost;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  private volatile MasterQuotaManager quotaManager;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private QuotaObserverChore quotaObserverChore;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private WALProcedureStore procedureStore;<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // handle table states<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private TableStateManager tableStateManager;<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private long splitPlanCount;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long mergePlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /* Handle favored nodes information */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  private FavoredNodesManager favoredNodesManager;<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private Server masterJettyServer;<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public static class RedirectServlet extends HttpServlet {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private final int regionServerInfoPort;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final String regionServerHostname;<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>     * @param infoServer that we're trying to send all requests to<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     */<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       regionServerInfoPort = infoServer.getPort();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerHostname = hostname;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    public void doGet(HttpServletRequest request,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      String redirectHost = regionServerHostname;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      if(redirectHost == null) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        redirectHost = request.getServerName();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "to an appropriate hostname.");<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          return;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      String redirectUrl = request.getScheme() + "://"<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + request.getRequestURI();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      response.sendRedirect(redirectUrl);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Initializes the HMaster. The steps are as follows:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * &lt;p&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;ol&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;/ol&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;p&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * Remaining steps of initialization occur in<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * the master becomes the active one.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public HMaster(final Configuration conf)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throws IOException, KeeperException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    super(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    TraceUtil.initTracer(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      // Disable usage of meta replicas in the master<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>      decorateMasterConfiguration(this.conf);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>      // should we check encryption settings at master side, default true<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // preload table descriptor at startup<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Do we publish the status?<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.538"></a>
-<span class="sourceLineNo">539</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.Publisher.class);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (shouldPublish) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        if (publisherClass == null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              " is not set - not publishing status");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        } else {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        }<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>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      } else {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        this.activeMasterManager = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    } catch (Throwable t) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // cause of failed startup is lost.<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      LOG.error("Failed construction of Master", t);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw t;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  @Override<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // block in here until then.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  @Override<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void run() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            int infoPort = putUpJettyServer();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            startActiveMasterManager(infoPort);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          } catch (Throwable t) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            // Make sure we log the exception.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            String error = "Failed to become Active Master";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            LOG.error(error, t);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            // Abort should have been called already.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            if (!isAborted()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              abort(error, t);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }), getName() + ":becomeActiveMaster");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // the super run call will do this for us.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      super.run();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    } finally {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      if (this.clusterSchemaService != null) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>        // If on way out, then we are no longer active master.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        this.clusterSchemaService.stopAsync();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          this.clusterSchemaService.awaitTerminated(<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (TimeoutException te) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      this.activeMaster = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  // return the actual infoPort, -1 means disable info server.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  private int putUpJettyServer() throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return -1;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // -1 is for disabling info server, so no redirecting<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return -1;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if(infoPort == infoServer.getPort()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      return infoPort;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      String msg =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.629"></a>
-<span class="sourceLineNo">630</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + "hbase.master.info.bindAddress";<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      LOG.error(msg);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      throw new IOException(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // a second entire stack here.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    masterJettyServer = new Server();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    connector.setHost(addr);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setPort(infoPort);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    masterJettyServer.addConnector(connector);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final String redirectHostname =<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.setServer(masterJettyServer);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    try {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      masterJettyServer.start();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } catch (Exception e) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return connector.getLocalPort();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  @Override<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      super.login(user, host);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    } catch (IOException ie) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      user.login("hbase.master.keytab.file",<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        "hbase.master.kerberos.principal", host);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * If configured to put regions on active master,<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * wait till a backup master becomes active.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Override<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  protected void waitForMasterActive(){<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      sleeper.sleep();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  @VisibleForTesting<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return (MasterRpcServices)rpcServices;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Override<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  protected String getProcessName() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return MASTER;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  protected boolean canCreateBaseZNode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return true;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  protected boolean canUpdateTableDescriptor() {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    return true;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  @Override<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    return new MasterRpcServices(this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void configureInfoServer() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    infoServer.addServlet("master-status", "/master-status", MasterStatusServlet.class);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    infoServer.setAttribute(MASTER, this);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    if (LoadBalancer.isTablesOnMaster(conf)) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      super.configureInfoServer();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return MasterDumpServlet.class;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public MetricsMaster getMasterMetrics() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return metricsMaster;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * &lt;p&gt;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * Initialize all ZK based system trackers. But do not include {@link RegionServerTracker}, it<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * should have already been initialized along with {@link ServerManager}.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * &lt;/p&gt;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * &lt;p&gt;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   * Will be overridden in tests.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>   * &lt;/p&gt;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   */<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  @VisibleForTesting<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  protected void initializeZKBasedSystemTrackers()<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      throws IOException, InterruptedException, KeeperException, ReplicationException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    this.balancer = LoadBalancerFactory.getLoadBalancer(conf);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    this.normalizer.setMasterServices(this);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    this.loadBalancerTracker = new LoadBalancerTracker(zooKeeper, this);<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    this.loadBalancerTracker.start();<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    this.regionNormalizerTracker = new RegionNormalizerTracker(zooKeeper, this);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    this.regionNormalizerTracker.start();<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    this.splitOrMergeTracker = new SplitOrMergeTracker(zooKeeper, conf, this);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    this.splitOrMergeTracker.start();<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    this.replicationPeerManager = ReplicationPeerManager.create(zooKeeper, conf);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    this.syncReplicationReplayWALManager = new SyncReplicationReplayWALManager(this);<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    this.drainingServerTracker = new DrainingServerTracker(zooKeeper, this, this.serverManager);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    this.drainingServerTracker.start();<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>    this.maintenanceModeTracker = new MasterMaintenanceModeTracker(zooKeeper);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    this.maintenanceModeTracker.start();<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    String clientQuorumServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    boolean clientZkObserverMode = conf.getBoolean(HConstants.CLIENT_ZOOKEEPER_OBSERVER_MODE,<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      HConstants.DEFAULT_CLIENT_ZOOKEEPER_OBSERVER_MODE);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (clientQuorumServers != null &amp;&amp; !clientZkObserverMode) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      // we need to take care of the ZK information synchronization<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      // if given client ZK are not observer nodes<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      ZKWatcher clientZkWatcher = new ZKWatcher(conf,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          getProcessName() + ":" + rpcServices.getSocketAddress().getPort() + "-clientZK", this,<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          false, true);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      this.metaLocationSyncer = new MetaLocationSyncer(zooKeeper, clientZkWatcher, this);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.metaLocationSyncer.start();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      this.masterAddressSyncer = new MasterAddressSyncer(zooKeeper, clientZkWatcher, this);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.masterAddressSyncer.start();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      // set cluster id is a one-go effort<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      ZKClusterId.setClusterId(clientZkWatcher, fileSystemManager.getClusterId());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Set the cluster as up.  If new RSs, they'll be waiting on this before<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // going ahead with their startup.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    boolean wasUp = this.clusterStatusTracker.isClusterUp();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    if (!wasUp) this.clusterStatusTracker.setClusterUp();<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    LOG.info("Active/primary master=" + this.serverName +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        ", sessionid=0x" +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()) +<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        ", setting cluster-up flag (Was=" + wasUp + ")");<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>    // create/initialize the snapshot manager and other procedure managers<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    this.snapshotManager = new SnapshotManager();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    this.mpmHost = new MasterProcedureManagerHost();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    this.mpmHost.register(this.snapshotManager);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    this.mpmHost.register(new MasterFlushTableProcedureManager());<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.mpmHost.loadProcedures(conf);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    this.mpmHost.initialize(this, this.metricsMaster);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  private static final ImmutableSet&lt;Class&lt;?&gt;&gt; UNSUPPORTED_PROCEDURES =<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ImmutableSet.of(RecoverMetaProcedure.class, AssignProcedure.class, UnassignProcedure.class,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      MoveRegionProcedure.class);<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * make sure that there are none these procedures when upgrading. If there are, the master will<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * quit, you need to go back to the old version to finish these procedures first before upgrading.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   */<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  private void checkUnsupportedProcedure(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType)<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throws HBaseIOException {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    // Confirm that we do not have unfinished assign/unassign related procedures. It is not easy to<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    // support both the old assign/unassign procedures and the new TransitRegionStateProcedure as<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    // there will be conflict in the code for AM. We should finish all these procedures before<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    // upgrading.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    for (Class&lt;?&gt; clazz : UNSUPPORTED_PROCEDURES) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt; procs = procsByType.get(clazz);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      if (procs != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        LOG.error(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          "Unsupported procedure type {} found, please rollback your master to the old" +<a name="line.831"></a>
-<span class="sourceLineNo">832</span>            " version to finish them, and then try to upgrade again. The full procedure list: {}",<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          clazz, procs);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        throw new HBaseIOException("Unsupported procedure type " + clazz + " found");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // A special check for SCP, as we do not support RecoverMetaProcedure any more so we need to<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    // make sure that no one will try to schedule it but SCP does have a state which will schedule<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    // it.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    if (procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      .map(p -&gt; (ServerCrashProcedure) p).anyMatch(ServerCrashProcedure::isInRecoverMetaState)) {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      LOG.error("At least one ServerCrashProcedure is going to schedule a RecoverMetaProcedure," +<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        " which is not supported any more. Please rollback your master to the old version to" +<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        " finish them, and then try to upgrade again.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      throw new HBaseIOException("Unsupported procedure state found for ServerCrashProcedure");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  // Will be overriden in test to inject customized AssignmentManager<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  @VisibleForTesting<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected AssignmentManager createAssignmentManager(MasterServices master) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return new AssignmentManager(master);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  /**<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * Finish initialization of HMaster after becoming the primary master.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * &lt;p/&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * The startup order is a bit complicated but very important, do not change it unless you know<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * what you are doing.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   * &lt;ol&gt;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>   * &lt;li&gt;Initialize file system based components - file system manager, wal manager, table<a name="line.861"></a>
-<span class="sourceLineNo">862</span>   * descriptors, etc&lt;/li&gt;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>   * &lt;li&gt;Publish cluster id&lt;/li&gt;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * &lt;li&gt;Here comes the most complicated part - initialize server manager, assignment manager and<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * region server tracker<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * &lt;ol type='i'&gt;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * &lt;li&gt;Create server manager&lt;/li&gt;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * &lt;li&gt;Create procedure executor, load the procedures, but do not start workers. We will start it<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * later after we finish scheduling SCPs to avoid scheduling duplicated SCPs for the same<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * server&lt;/li&gt;<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * &lt;li&gt;Create assignment manager and start it, load the meta region state, but do not load data<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * from meta region&lt;/li&gt;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * &lt;li&gt;Start region server tracker, construct the online servers set and find out dead servers and<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * schedule SCP for them. The online servers will be constructed by scanning zk, and we will also<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * scan the wal directory to find out possible live region servers, and the differences between<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * these two sets are the dead servers&lt;/li&gt;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;/ol&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * &lt;/li&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * &lt;li&gt;If this is a new deploy, schedule a InitMetaProcedure to initialize meta&lt;/li&gt;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * &lt;li&gt;Start necessary service threads - balancer, catalog janior, executor services, and also the<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * procedure executor, etc. Notice that the balancer must be created first as assignment manager<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * may use it when assigning regions.&lt;/li&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * &lt;li&gt;Wait for meta to be initialized if necesssary, start table state manager.&lt;/li&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * &lt;li&gt;Wait for enough region servers to check-in&lt;/li&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * &lt;li&gt;Let assignment manager load data from meta and construct region states&lt;/li&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * &lt;li&gt;Start all other things such as chore services, etc&lt;/li&gt;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   * &lt;/ol&gt;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>   * &lt;p/&gt;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Notice that now we will not schedule a special procedure to make meta online(unless the first<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * time where meta has not been created yet), we will rely on SCP to bring meta online.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  private void finishActiveMasterInitialization(MonitoredTask status) throws IOException,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          InterruptedException, KeeperException, ReplicationException {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    Thread zombieDetector = new Thread(new InitializationMonitor(this),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        "ActiveMasterInitializationMonitor-" + System.currentTimeMillis());<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    zombieDetector.setDaemon(true);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    zombieDetector.start();<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>    /*<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * We are active master now... go initialize components we need to run.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    status.setStatus("Initializing Master file system");<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>    this.masterActiveTime = System.currentTimeMillis();<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // TODO: Do this using Dependency Injection, using PicoContainer, Guice or Spring.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    // Initialize the chunkCreator<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    initializeMemStoreChunkCreator();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    this.fileSystemManager = new MasterFileSystem(conf);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    this.walManager = new MasterWalManager(this);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // enable table descriptors cache<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    this.tableDescriptors.setCacheOn();<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // warm-up HTDs cache on master initialization<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    if (preLoadTableDescriptors) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      status.setStatus("Pre-loading table descriptors");<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      this.tableDescriptors.getAll();<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Publish cluster ID; set it in Master too. The superclass RegionServer does this later but<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    // only after it has checked in with the Master. At least a few tests ask Master for clusterId<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // before it has called its run method and before RegionServer has done the reportForDuty.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    ClusterId clusterId = fileSystemManager.getClusterId();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    status.setStatus("Publishing Cluster ID " + clusterId + " in ZooKeeper");<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    ZKClusterId.setClusterId(this.zooKeeper, fileSystemManager.getClusterId());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    this.clusterId = clusterId.toString();<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // Precaution. Put in place the old hbck1 lock file to fence out old hbase1s running their<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // hbck1s against an hbase2 cluster; it could do damage. To skip this behavior, set<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // hbase.write.hbck1.lock.file to false.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (this.conf.getBoolean("hbase.write.hbck1.lock.file", true)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      HBaseFsck.checkAndMarkRunningHbck(this.conf,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          HBaseFsck.createLockRetryCounterFactory(this.conf).create());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    status.setStatus("Initialize ServerManager and schedule SCP for crash servers");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    this.serverManager = createServerManager(this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    createProcedureExecutor();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    @SuppressWarnings("rawtypes")<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType =<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      procedureExecutor.getActiveProceduresNoCopy().stream()<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        .collect(Collectors.groupingBy(p -&gt; p.getClass()));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>    checkUnsupportedProcedure(procsByType);<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    // Create Assignment Manager<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    this.assignmentManager = createAssignmentManager(this);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    this.assignmentManager.start();<a name="line.948"></a>
-<span class="sourceLineNo">949</span>    // TODO: TRSP can perform as the sub procedure for other procedures, so even if it is marked as<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    // completed, it could still be in the procedure list. This is a bit strange but is another<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    // story, need to verify the implementation for ProcedureExecutor and ProcedureStore.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    List&lt;TransitRegionStateProcedure&gt; ritList =<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      procsByType.getOrDefault(TransitRegionStateProcedure.class, Collections.emptyList()).stream()<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        .filter(p -&gt; !p.isFinished()).map(p -&gt; (TransitRegionStateProcedure) p)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        .collect(Collectors.toList());<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    this.assignmentManager.setupRIT(ritList);<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // Start RegionServerTracker with listing of servers found with exiting SCPs -- these should<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // be registered in the deadServers set -- and with the list of servernames out on the<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    // filesystem that COULD BE 'alive' (we'll schedule SCPs for each and let SCP figure it out).<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    // We also pass dirs that are already 'splitting'... so we can do some checks down in tracker.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // TODO: Generate the splitting and live Set in one pass instead of two as we currently do.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    this.regionServerTracker = new RegionServerTracker(zooKeeper, this, this.serverManager);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    this.regionServerTracker.start(<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        .map(p -&gt; (ServerCrashProcedure) p).map(p -&gt; p.getServerName()).collect(Collectors.toSet()),<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      walManager.getLiveServersFromWALDir(), walManager.getSplittingServersFromWALDir());<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    // This manager will be started AFTER hbase:meta is confirmed on line.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    // hbase.mirror.table.state.to.zookeeper is so hbase1 clients can connect. They read table<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    // state from zookeeper while hbase2 reads it from hbase:meta. Disable if no hbase1 clients.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    this.tableStateManager =<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY, true)<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        ?<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        new MirroringTableStateManager(this):<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        new TableStateManager(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    status.setStatus("Initializing ZK system trackers");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    initializeZKBasedSystemTrackers();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    status.setStatus("Loading last flushed sequence id of regions");<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    try {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    } catch (IOException e) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          + " from file system", e);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    this.activeMaster = true;<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>    // This is for backwards compatibility<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // See HBASE-11393<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    status.setStatus("Update TableCFs node in ZNode");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    ReplicationPeerConfigUpgrader tableCFsUpdater =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        new ReplicationPeerConfigUpgrader(zooKeeper, conf);<a name="line.993"></a>
-<span class="sourceLineNo">994</span>    tableCFsUpdater.copyTableCFs();<a

<TRUNCATED>

[28/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a n

<TRUNCATED>

[31/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446

<TRUNCATED>

[30/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo

<TRUNCATED>

[19/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
index bd1b3f6..0c69df9 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
@@ -31,430 +31,441 @@
 <span class="sourceLineNo">023</span>import java.util.Iterator;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.util.Map;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.TreeMap;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><a name="line.26"></a>
+<span class="sourceLineNo">026</span>import java.util.stream.LongStream;<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.apache.yetus.audience.InterfaceStability;<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> * Keeps track of live procedures.<a name="line.32"></a>
-<span class="sourceLineNo">033</span> *<a name="line.33"></a>
-<span class="sourceLineNo">034</span> * It can be used by the ProcedureStore to identify which procedures are already<a name="line.34"></a>
-<span class="sourceLineNo">035</span> * deleted/completed to avoid the deserialization step on restart<a name="line.35"></a>
-<span class="sourceLineNo">036</span> */<a name="line.36"></a>
-<span class="sourceLineNo">037</span>@InterfaceAudience.Private<a name="line.37"></a>
-<span class="sourceLineNo">038</span>@InterfaceStability.Evolving<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class ProcedureStoreTracker {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  // Key is procedure id corresponding to first bit of the bitmap.<a name="line.40"></a>
-<span class="sourceLineNo">041</span>  private final TreeMap&lt;Long, BitSetNode&gt; map = new TreeMap&lt;&gt;();<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>   * If true, do not remove bits corresponding to deleted procedures. Note that this can result<a name="line.44"></a>
-<span class="sourceLineNo">045</span>   * in huge bitmaps overtime.<a name="line.45"></a>
-<span class="sourceLineNo">046</span>   * Currently, it's set to true only when building tracker state from logs during recovery. During<a name="line.46"></a>
-<span class="sourceLineNo">047</span>   * recovery, if we are sure that a procedure has been deleted, reading its old update entries<a name="line.47"></a>
-<span class="sourceLineNo">048</span>   * can be skipped.<a name="line.48"></a>
-<span class="sourceLineNo">049</span>   */<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  private boolean keepDeletes = false;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   * If true, it means tracker has incomplete information about the active/deleted procedures.<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   * It's set to true only when recovering from old logs. See {@link #isDeleted(long)} docs to<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   * understand it's real use.<a name="line.54"></a>
-<span class="sourceLineNo">055</span>   */<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  boolean partial = false;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  private long minModifiedProcId = Long.MAX_VALUE;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  private long maxModifiedProcId = Long.MIN_VALUE;<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  public enum DeleteState { YES, NO, MAYBE }<a name="line.61"></a>
-<span class="sourceLineNo">062</span><a name="line.62"></a>
-<span class="sourceLineNo">063</span>  public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>    reset();<a name="line.64"></a>
-<span class="sourceLineNo">065</span>    for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      final BitSetNode node = new BitSetNode(protoNode);<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      map.put(node.getStart(), node);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<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>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Resets internal state to same as given {@code tracker}. Does deep copy of the bitmap.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>  public void resetTo(ProcedureStoreTracker tracker) {<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    resetTo(tracker, false);<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  }<a name="line.76"></a>
-<span class="sourceLineNo">077</span><a name="line.77"></a>
-<span class="sourceLineNo">078</span>  /**<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   * Resets internal state to same as given {@code tracker}, and change the deleted flag according<a name="line.79"></a>
-<span class="sourceLineNo">080</span>   * to the modified flag if {@code resetDelete} is true. Does deep copy of the bitmap.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>   * &lt;p/&gt;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>   * The {@code resetDelete} will be set to true when building cleanup tracker, please see the<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * comments in {@link BitSetNode#BitSetNode(BitSetNode, boolean)} to learn how we change the<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * deleted flag if {@code resetDelete} is true.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   */<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  public void resetTo(ProcedureStoreTracker tracker, boolean resetDelete) {<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    reset();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    this.partial = tracker.partial;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>    this.minModifiedProcId = tracker.minModifiedProcId;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    this.maxModifiedProcId = tracker.maxModifiedProcId;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this.keepDeletes = tracker.keepDeletes;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : tracker.map.entrySet()) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      map.put(entry.getKey(), new BitSetNode(entry.getValue(), resetDelete));<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>  public void insert(long procId) {<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    insert(null, procId);<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>  public void insert(long[] procIds) {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.102"></a>
-<span class="sourceLineNo">103</span>      insert(procIds[i]);<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><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  public void insert(long procId, long[] subProcIds) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>    BitSetNode node = update(null, procId);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>    for (int i = 0; i &lt; subProcIds.length; ++i) {<a name="line.109"></a>
-<span class="sourceLineNo">110</span>      node = insert(node, subProcIds[i]);<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><a name="line.113"></a>
-<span class="sourceLineNo">114</span>  private BitSetNode insert(BitSetNode node, long procId) {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    if (node == null || !node.contains(procId)) {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      node = getOrCreateNode(procId);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    }<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    node.insertOrUpdate(procId);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    trackProcIds(procId);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    return node;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
-<span class="sourceLineNo">122</span><a name="line.122"></a>
-<span class="sourceLineNo">123</span>  public void update(long procId) {<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    update(null, procId);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  }<a name="line.125"></a>
-<span class="sourceLineNo">126</span><a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private BitSetNode update(BitSetNode node, long procId) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    node = lookupClosestNode(node, procId);<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    assert node != null : "expected node to update procId=" + procId;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>    node.insertOrUpdate(procId);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    trackProcIds(procId);<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    return node;<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>  public void delete(long procId) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    delete(null, procId);<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>  public void delete(final long[] procIds) {<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    Arrays.sort(procIds);<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    BitSetNode node = null;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      node = delete(node, procIds[i]);<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>  private BitSetNode delete(BitSetNode node, long procId) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    node = lookupClosestNode(node, procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    assert node != null : "expected node to delete procId=" + procId;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>    node.delete(procId);<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    if (!keepDeletes &amp;&amp; node.isEmpty()) {<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      // TODO: RESET if (map.size() == 1)<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      map.remove(node.getStart());<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>    trackProcIds(procId);<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    return node;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  }<a name="line.160"></a>
-<span class="sourceLineNo">161</span><a name="line.161"></a>
-<span class="sourceLineNo">162</span>  /**<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Will be called when restarting where we need to rebuild the ProcedureStoreTracker.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   */<a name="line.164"></a>
-<span class="sourceLineNo">165</span>  public void setMinMaxModifiedProcIds(long min, long max) {<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    this.minModifiedProcId = min;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    this.maxModifiedProcId = max;<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>   * This method is used when restarting where we need to rebuild the ProcedureStoreTracker. The<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * {@link #delete(long)} method above assume that the {@link BitSetNode} exists, but when restart<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * this is not true, as we will read the wal files in reverse order so a delete may come first.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   */<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  public void setDeleted(long procId, boolean isDeleted) {<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    BitSetNode node = getOrCreateNode(procId);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node=" + node;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    node.updateState(procId, isDeleted);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    trackProcIds(procId);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
-<span class="sourceLineNo">180</span><a name="line.180"></a>
-<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * Set the given bit for the procId to delete if it was modified before.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * &lt;p/&gt;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * This method is used to test whether a procedure wal file can be safely deleted, as if all the<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   * procedures in the given procedure wal file has been modified in the new procedure wal files,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * then we can delete it.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   */<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  public void setDeletedIfModified(long... procId) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    BitSetNode node = null;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    for (int i = 0; i &lt; procId.length; ++i) {<a name="line.190"></a>
-<span class="sourceLineNo">191</span>      node = lookupClosestNode(node, procId[i]);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      if (node != null &amp;&amp; node.isModified(procId[i])) {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>        node.delete(procId[i]);<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>
-<span class="sourceLineNo">198</span>  /**<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * Similar with {@link #setDeletedIfModified(long...)}, but here the {@code procId} are given by<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the {@code tracker}. If a procedure is modified by us, and also by the given {@code tracker},<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * then we mark it as deleted.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * @see #setDeletedIfModified(long...)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  public void setDeletedIfModifiedInBoth(ProcedureStoreTracker tracker) {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    BitSetNode trackerNode = null;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    for (BitSetNode node : map.values()) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      final long minProcId = node.getStart();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      final long maxProcId = node.getEnd();<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      for (long procId = minProcId; procId &lt;= maxProcId; ++procId) {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>        if (!node.isModified(procId)) {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>          continue;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>        }<a name="line.212"></a>
-<span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>        trackerNode = tracker.lookupClosestNode(trackerNode, procId);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        if (trackerNode == null || !trackerNode.contains(procId) ||<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          trackerNode.isModified(procId)) {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>          // the procedure was removed or modified<a name="line.217"></a>
-<span class="sourceLineNo">218</span>          node.delete(procId);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>        }<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      }<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
-<span class="sourceLineNo">225</span>   * lookup the node containing the specified procId.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * @param node cached node to check before doing a lookup<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * @param procId the procId to lookup<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @return the node that may contains the procId or null<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  private BitSetNode lookupClosestNode(final BitSetNode node, final long procId) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    if (node != null &amp;&amp; node.contains(procId)) return node;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return entry != null ? entry.getValue() : null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  private void trackProcIds(long procId) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    minModifiedProcId = Math.min(minModifiedProcId, procId);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    maxModifiedProcId = Math.max(maxModifiedProcId, procId);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  public long getModifiedMinProcId() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return minModifiedProcId;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public long getModifiedMaxProcId() {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    return maxModifiedProcId;<a name="line.246"></a>
-<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>  public void reset() {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    this.keepDeletes = false;<a name="line.250"></a>
-<span class="sourceLineNo">251</span>    this.partial = false;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    this.map.clear();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>    resetModified();<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  }<a name="line.254"></a>
-<span class="sourceLineNo">255</span><a name="line.255"></a>
-<span class="sourceLineNo">256</span>  public boolean isModified(long procId) {<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    return entry != null &amp;&amp; entry.getValue().contains(procId) &amp;&amp;<a name="line.258"></a>
-<span class="sourceLineNo">259</span>      entry.getValue().isModified(procId);<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * If {@link #partial} is false, returns state from the bitmap. If no state is found for<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   * {@code procId}, returns YES.<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   * If partial is true, tracker doesn't have complete view of system state, so it returns MAYBE<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * if there is no update for the procedure or if it doesn't have a state in bitmap. Otherwise,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   * returns state from the bitmap.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>   */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public DeleteState isDeleted(long procId) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    if (entry != null &amp;&amp; entry.getValue().contains(procId)) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      BitSetNode node = entry.getValue();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      DeleteState state = node.isDeleted(procId);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      return partial &amp;&amp; !node.isModified(procId) ? DeleteState.MAYBE : state;<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    return partial ? DeleteState.MAYBE : DeleteState.YES;<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>  public long getActiveMinProcId() {<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    // TODO: Cache?<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.firstEntry();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    return entry == null ? 0 : entry.getValue().getActiveMinProcId();<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>  public void setKeepDeletes(boolean keepDeletes) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    this.keepDeletes = keepDeletes;<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // If not to keep deletes, remove the BitSetNodes which are empty (i.e. contains ids of deleted<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // procedures).<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    if (!keepDeletes) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      Iterator&lt;Map.Entry&lt;Long, BitSetNode&gt;&gt; it = map.entrySet().iterator();<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      while (it.hasNext()) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        Map.Entry&lt;Long, BitSetNode&gt; entry = it.next();<a name="line.292"></a>
-<span class="sourceLineNo">293</span>        if (entry.getValue().isEmpty()) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          it.remove();<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
-<span class="sourceLineNo">298</span>  }<a name="line.298"></a>
-<span class="sourceLineNo">299</span><a name="line.299"></a>
-<span class="sourceLineNo">300</span>  public boolean isPartial() {<a name="line.300"></a>
-<span class="sourceLineNo">301</span>    return partial;<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  }<a name="line.302"></a>
-<span class="sourceLineNo">303</span><a name="line.303"></a>
-<span class="sourceLineNo">304</span>  public void setPartialFlag(boolean isPartial) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    if (this.partial &amp;&amp; !isPartial) {<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        entry.getValue().unsetPartialFlag();<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      }<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.partial = isPartial;<a name="line.310"></a>
-<span class="sourceLineNo">311</span>  }<a name="line.311"></a>
-<span class="sourceLineNo">312</span><a name="line.312"></a>
-<span class="sourceLineNo">313</span>  /**<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   * @return true, if no procedure is active, else false.<a name="line.314"></a>
-<span class="sourceLineNo">315</span>   */<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  public boolean isEmpty() {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      if (!entry.getValue().isEmpty()) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        return false;<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>    return true;<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * @return true if all procedure was modified or deleted since last call to<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   *         {@link #resetModified()}.<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   */<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  public boolean isAllModified() {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      if (!entry.getValue().isAllModified()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        return false;<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    return true;<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  }<a name="line.336"></a>
-<span class="sourceLineNo">337</span><a name="line.337"></a>
-<span class="sourceLineNo">338</span>  /**<a name="line.338"></a>
-<span class="sourceLineNo">339</span>   * Clears the list of updated procedure ids. This doesn't affect global list of active<a name="line.339"></a>
-<span class="sourceLineNo">340</span>   * procedure ids.<a name="line.340"></a>
-<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  public void resetModified() {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      entry.getValue().resetModified();<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    minModifiedProcId = Long.MAX_VALUE;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    maxModifiedProcId = Long.MIN_VALUE;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  }<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private BitSetNode getOrCreateNode(long procId) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    // If procId can fit in left node (directly or by growing it)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    BitSetNode leftNode = null;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    boolean leftCanGrow = false;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    Map.Entry&lt;Long, BitSetNode&gt; leftEntry = map.floorEntry(procId);<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (leftEntry != null) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      leftNode = leftEntry.getValue();<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      if (leftNode.contains(procId)) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        return leftNode;<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>      leftCanGrow = leftNode.canGrow(procId);<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>    // If procId can fit in right node (directly or by growing it)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    BitSetNode rightNode = null;<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    boolean rightCanGrow = false;<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    Map.Entry&lt;Long, BitSetNode&gt; rightEntry = map.ceilingEntry(procId);<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    if (rightEntry != null) {<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      rightNode = rightEntry.getValue();<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      rightCanGrow = rightNode.canGrow(procId);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (leftNode != null) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        if (leftNode.canMerge(rightNode)) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>          // merge left and right node<a name="line.372"></a>
-<span class="sourceLineNo">373</span>          return mergeNodes(leftNode, rightNode);<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>        // If left and right nodes can not merge, decide which one to grow.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        if (leftCanGrow &amp;&amp; rightCanGrow) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          if ((procId - leftNode.getEnd()) &lt;= (rightNode.getStart() - procId)) {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>            return growNode(leftNode, procId);<a name="line.379"></a>
-<span class="sourceLineNo">380</span>          }<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          return growNode(rightNode, procId);<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        }<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>    // grow the left node<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    if (leftCanGrow) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      return growNode(leftNode, procId);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    // grow the right node<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    if (rightCanGrow) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>      return growNode(rightNode, procId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>    // add new node if there are no left/right nodes which can be used.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    BitSetNode node = new BitSetNode(procId, partial);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    map.put(node.getStart(), node);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    return node;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>  }<a name="line.400"></a>
+<span class="sourceLineNo">029</span><a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>/**<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * Keeps track of live procedures.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> *<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * It can be used by the ProcedureStore to identify which procedures are already<a name="line.35"></a>
+<span class="sourceLineNo">036</span> * deleted/completed to avoid the deserialization step on restart<a name="line.36"></a>
+<span class="sourceLineNo">037</span> */<a name="line.37"></a>
+<span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
+<span class="sourceLineNo">039</span>@InterfaceStability.Evolving<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public class ProcedureStoreTracker {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  // Key is procedure id corresponding to first bit of the bitmap.<a name="line.41"></a>
+<span class="sourceLineNo">042</span>  private final TreeMap&lt;Long, BitSetNode&gt; map = new TreeMap&lt;&gt;();<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>   * If true, do not remove bits corresponding to deleted procedures. Note that this can result<a name="line.45"></a>
+<span class="sourceLineNo">046</span>   * in huge bitmaps overtime.<a name="line.46"></a>
+<span class="sourceLineNo">047</span>   * Currently, it's set to true only when building tracker state from logs during recovery. During<a name="line.47"></a>
+<span class="sourceLineNo">048</span>   * recovery, if we are sure that a procedure has been deleted, reading its old update entries<a name="line.48"></a>
+<span class="sourceLineNo">049</span>   * can be skipped.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private boolean keepDeletes = false;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>  /**<a name="line.52"></a>
+<span class="sourceLineNo">053</span>   * If true, it means tracker has incomplete information about the active/deleted procedures.<a name="line.53"></a>
+<span class="sourceLineNo">054</span>   * It's set to true only when recovering from old logs. See {@link #isDeleted(long)} docs to<a name="line.54"></a>
+<span class="sourceLineNo">055</span>   * understand it's real use.<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   */<a name="line.56"></a>
+<span class="sourceLineNo">057</span>  boolean partial = false;<a name="line.57"></a>
+<span class="sourceLineNo">058</span><a name="line.58"></a>
+<span class="sourceLineNo">059</span>  private long minModifiedProcId = Long.MAX_VALUE;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>  private long maxModifiedProcId = Long.MIN_VALUE;<a name="line.60"></a>
+<span class="sourceLineNo">061</span><a name="line.61"></a>
+<span class="sourceLineNo">062</span>  public enum DeleteState { YES, NO, MAYBE }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  public void resetToProto(ProcedureProtos.ProcedureStoreTracker trackerProtoBuf) {<a name="line.64"></a>
+<span class="sourceLineNo">065</span>    reset();<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    for (ProcedureProtos.ProcedureStoreTracker.TrackerNode protoNode: trackerProtoBuf.getNodeList()) {<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      final BitSetNode node = new BitSetNode(protoNode);<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      map.put(node.getStart(), node);<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><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Resets internal state to same as given {@code tracker}. Does deep copy of the bitmap.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  public void resetTo(ProcedureStoreTracker tracker) {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    resetTo(tracker, false);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  /**<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   * Resets internal state to same as given {@code tracker}, and change the deleted flag according<a name="line.80"></a>
+<span class="sourceLineNo">081</span>   * to the modified flag if {@code resetDelete} is true. Does deep copy of the bitmap.<a name="line.81"></a>
+<span class="sourceLineNo">082</span>   * &lt;p/&gt;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * The {@code resetDelete} will be set to true when building cleanup tracker, please see the<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * comments in {@link BitSetNode#BitSetNode(BitSetNode, boolean)} to learn how we change the<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   * deleted flag if {@code resetDelete} is true.<a name="line.85"></a>
+<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  public void resetTo(ProcedureStoreTracker tracker, boolean resetDelete) {<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    reset();<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    this.partial = tracker.partial;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    this.minModifiedProcId = tracker.minModifiedProcId;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    this.maxModifiedProcId = tracker.maxModifiedProcId;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    this.keepDeletes = tracker.keepDeletes;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : tracker.map.entrySet()) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      map.put(entry.getKey(), new BitSetNode(entry.getValue(), resetDelete));<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><a name="line.97"></a>
+<span class="sourceLineNo">098</span>  public void insert(long procId) {<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    insert(null, procId);<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>  public void insert(long[] procIds) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.103"></a>
+<span class="sourceLineNo">104</span>      insert(procIds[i]);<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><a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public void insert(long procId, long[] subProcIds) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    BitSetNode node = update(null, procId);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    for (int i = 0; i &lt; subProcIds.length; ++i) {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      node = insert(node, subProcIds[i]);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>    }<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  }<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>  private BitSetNode insert(BitSetNode node, long procId) {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    if (node == null || !node.contains(procId)) {<a name="line.116"></a>
+<span class="sourceLineNo">117</span>      node = getOrCreateNode(procId);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    }<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    node.insertOrUpdate(procId);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    trackProcIds(procId);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    return node;<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>  public void update(long procId) {<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    update(null, procId);<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>  private BitSetNode update(BitSetNode node, long procId) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    node = lookupClosestNode(node, procId);<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    assert node != null : "expected node to update procId=" + procId;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    node.insertOrUpdate(procId);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    trackProcIds(procId);<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    return node;<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>  public void delete(long procId) {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    delete(null, procId);<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>  public void delete(final long[] procIds) {<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    Arrays.sort(procIds);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    BitSetNode node = null;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    for (int i = 0; i &lt; procIds.length; ++i) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      node = delete(node, procIds[i]);<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>  private BitSetNode delete(BitSetNode node, long procId) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    node = lookupClosestNode(node, procId);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    assert node != null : "expected node to delete procId=" + procId;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    node.delete(procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    if (!keepDeletes &amp;&amp; node.isEmpty()) {<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      // TODO: RESET if (map.size() == 1)<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      map.remove(node.getStart());<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>    trackProcIds(procId);<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    return node;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>  }<a name="line.161"></a>
+<span class="sourceLineNo">162</span><a name="line.162"></a>
+<span class="sourceLineNo">163</span>  /**<a name="line.163"></a>
+<span class="sourceLineNo">164</span>   * Will be called when restarting where we need to rebuild the ProcedureStoreTracker.<a name="line.164"></a>
+<span class="sourceLineNo">165</span>   */<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  public void setMinMaxModifiedProcIds(long min, long max) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    this.minModifiedProcId = min;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    this.maxModifiedProcId = max;<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  }<a name="line.169"></a>
+<span class="sourceLineNo">170</span>  /**<a name="line.170"></a>
+<span class="sourceLineNo">171</span>   * This method is used when restarting where we need to rebuild the ProcedureStoreTracker. The<a name="line.171"></a>
+<span class="sourceLineNo">172</span>   * {@link #delete(long)} method above assume that the {@link BitSetNode} exists, but when restart<a name="line.172"></a>
+<span class="sourceLineNo">173</span>   * this is not true, as we will read the wal files in reverse order so a delete may come first.<a name="line.173"></a>
+<span class="sourceLineNo">174</span>   */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  public void setDeleted(long procId, boolean isDeleted) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    BitSetNode node = getOrCreateNode(procId);<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    assert node.contains(procId) : "expected procId=" + procId + " in the node=" + node;<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    node.updateState(procId, isDeleted);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    trackProcIds(procId);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  }<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>  /**<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * Set the given bit for the procId to delete if it was modified before.<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   * &lt;p/&gt;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>   * This method is used to test whether a procedure wal file can be safely deleted, as if all the<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * procedures in the given procedure wal file has been modified in the new procedure wal files,<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   * then we can delete it.<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   */<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  public void setDeletedIfModified(long... procId) {<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    BitSetNode node = null;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    for (int i = 0; i &lt; procId.length; ++i) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      node = lookupClosestNode(node, procId[i]);<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      if (node != null &amp;&amp; node.isModified(procId[i])) {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>        node.delete(procId[i]);<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><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  /**<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * Similar with {@link #setDeletedIfModified(long...)}, but here the {@code procId} are given by<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * the {@code tracker}. If a procedure is modified by us, and also by the given {@code tracker},<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * then we mark it as deleted.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @see #setDeletedIfModified(long...)<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public void setDeletedIfModifiedInBoth(ProcedureStoreTracker tracker) {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    BitSetNode trackerNode = null;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    for (BitSetNode node : map.values()) {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      final long minProcId = node.getStart();<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      final long maxProcId = node.getEnd();<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      for (long procId = minProcId; procId &lt;= maxProcId; ++procId) {<a name="line.210"></a>
+<span class="sourceLineNo">211</span>        if (!node.isModified(procId)) {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>          continue;<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>        trackerNode = tracker.lookupClosestNode(trackerNode, procId);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>        if (trackerNode == null || !trackerNode.contains(procId) ||<a name="line.216"></a>
+<span class="sourceLineNo">217</span>          trackerNode.isModified(procId)) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>          // the procedure was removed or modified<a name="line.218"></a>
+<span class="sourceLineNo">219</span>          node.delete(procId);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        }<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      }<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span>  }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>  /**<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * lookup the node containing the specified procId.<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param node cached node to check before doing a lookup<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @param procId the procId to lookup<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   * @return the node that may contains the procId or null<a name="line.229"></a>
+<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  private BitSetNode lookupClosestNode(final BitSetNode node, final long procId) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    if (node != null &amp;&amp; node.contains(procId)) return node;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    return entry != null ? entry.getValue() : null;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  private void trackProcIds(long procId) {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    minModifiedProcId = Math.min(minModifiedProcId, procId);<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    maxModifiedProcId = Math.max(maxModifiedProcId, procId);<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>  public long getModifiedMinProcId() {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>    return minModifiedProcId;<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  }<a name="line.244"></a>
+<span class="sourceLineNo">245</span><a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public long getModifiedMaxProcId() {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    return maxModifiedProcId;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
+<span class="sourceLineNo">249</span><a name="line.249"></a>
+<span class="sourceLineNo">250</span>  public void reset() {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.keepDeletes = false;<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    this.partial = false;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    this.map.clear();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    resetModified();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  }<a name="line.255"></a>
+<span class="sourceLineNo">256</span><a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public boolean isModified(long procId) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    return entry != null &amp;&amp; entry.getValue().contains(procId) &amp;&amp;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      entry.getValue().isModified(procId);<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * If {@link #partial} is false, returns state from the bitmap. If no state is found for<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * {@code procId}, returns YES.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * If partial is true, tracker doesn't have complete view of system state, so it returns MAYBE<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   * if there is no update for the procedure or if it doesn't have a state in bitmap. Otherwise,<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * returns state from the bitmap.<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  public DeleteState isDeleted(long procId) {<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.floorEntry(procId);<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    if (entry != null &amp;&amp; entry.getValue().contains(procId)) {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      BitSetNode node = entry.getValue();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      DeleteState state = node.isDeleted(procId);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      return partial &amp;&amp; !node.isModified(procId) ? DeleteState.MAYBE : state;<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    }<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    return partial ? DeleteState.MAYBE : DeleteState.YES;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public long getActiveMinProcId() {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // TODO: Cache?<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    Map.Entry&lt;Long, BitSetNode&gt; entry = map.firstEntry();<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    return entry == null ? 0 : entry.getValue().getActiveMinProcId();<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>  public void setKeepDeletes(boolean keepDeletes) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.keepDeletes = keepDeletes;<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    // If not to keep deletes, remove the BitSetNodes which are empty (i.e. contains ids of deleted<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    // procedures).<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    if (!keepDeletes) {<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      Iterator&lt;Map.Entry&lt;Long, BitSetNode&gt;&gt; it = map.entrySet().iterator();<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      while (it.hasNext()) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        Map.Entry&lt;Long, BitSetNode&gt; entry = it.next();<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        if (entry.getValue().isEmpty()) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          it.remove();<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      }<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    }<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  }<a name="line.299"></a>
+<span class="sourceLineNo">300</span><a name="line.300"></a>
+<span class="sourceLineNo">301</span>  public boolean isPartial() {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>    return partial;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  }<a name="line.303"></a>
+<span class="sourceLineNo">304</span><a name="line.304"></a>
+<span class="sourceLineNo">305</span>  public void setPartialFlag(boolean isPartial) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    if (this.partial &amp;&amp; !isPartial) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>        entry.getValue().unsetPartialFlag();<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>    this.partial = isPartial;<a name="line.311"></a>
+<span class="sourceLineNo">312</span>  }<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>  /**<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @return true, if no procedure is active, else false.<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public boolean isEmpty() {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      if (!entry.getValue().isEmpty()) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>        return false;<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>    return true;<a name="line.323"></a>
+<span class="sourceLineNo">324</span>  }<a name="line.324"></a>
+<span class="sourceLineNo">325</span><a name="line.325"></a>
+<span class="sourceLineNo">326</span>  /**<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * @return true if all procedure was modified or deleted since last call to<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   *         {@link #resetModified()}.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  public boolean isAllModified() {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      if (!entry.getValue().isAllModified()) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>        return false;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    }<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    return true;<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  }<a name="line.337"></a>
+<span class="sourceLineNo">338</span><a name="line.338"></a>
+<span class="sourceLineNo">339</span>  /**<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * Will be used when there are too many proc wal files. We will rewrite the states of the active<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   * procedures in the oldest proc wal file so that we can delete it.<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @return all the active procedure ids in this tracker.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  public long[] getAllActiveProcIds() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    return map.values().stream().map(BitSetNode::getActiveProcIds).filter(p -&gt; p.length &gt; 0)<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      .flatMapToLong(LongStream::of).toArray();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>  }<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Clears the list of updated procedure ids. This doesn't affect global list of active<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   * procedure ids.<a name="line.351"></a>
+<span class="sourceLineNo">352</span>   */<a name="line.352"></a>
+<span class="sourceLineNo">353</span>  public void resetModified() {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      entry.getValue().resetModified();<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    }<a name="line.356"></a>
+<span class="sourceLineNo">357</span>    minModifiedProcId = Long.MAX_VALUE;<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    maxModifiedProcId = Long.MIN_VALUE;<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>  private BitSetNode getOrCreateNode(long procId) {<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    // If procId can fit in left node (directly or by growing it)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    BitSetNode leftNode = null;<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    boolean leftCanGrow = false;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    Map.Entry&lt;Long, BitSetNode&gt; leftEntry = map.floorEntry(procId);<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    if (leftEntry != null) {<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      leftNode = leftEntry.getValue();<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      if (leftNode.contains(procId)) {<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        return leftNode;<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>      leftCanGrow = leftNode.canGrow(procId);<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>    // If procId can fit in right node (directly or by growing it)<a name="line.374"></a>
+<span class="sourceLineNo">375</span>    BitSetNode rightNode = null;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    boolean rightCanGrow = false;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    Map.Entry&lt;Long, BitSetNode&gt; rightEntry = map.ceilingEntry(procId);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    if (rightEntry != null) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      rightNode = rightEntry.getValue();<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      rightCanGrow = rightNode.canGrow(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      if (leftNode != null) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>        if (leftNode.canMerge(rightNode)) {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>          // merge left and right node<a name="line.383"></a>
+<span class="sourceLineNo">384</span>          return mergeNodes(leftNode, rightNode);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        }<a name="line.385"></a>
+<span class="sourceLineNo">386</span><a name="line.386"></a>
+<span class="sourceLineNo">387</span>        // If left and right nodes can not merge, decide which one to grow.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        if (leftCanGrow &amp;&amp; rightCanGrow) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>          if ((procId - leftNode.getEnd()) &lt;= (rightNode.getStart() - procId)) {<a name="line.389"></a>
+<span class="sourceLineNo">390</span>            return growNode(leftNode, procId);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>          }<a name="line.391"></a>
+<span class="sourceLineNo">392</span>          return growNode(rightNode, procId);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        }<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>    // grow the left node<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    if (leftCanGrow) {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      return growNode(leftNode, procId);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    }<a name="line.400"></a>
 <span class="sourceLineNo">401</span><a name="line.401"></a>
-<span class="sourceLineNo">402</span>  /**<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * Grows {@code node} to contain {@code procId} and updates the map.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   * @return {@link BitSetNode} instance which contains {@code procId}.<a name="line.404"></a>
-<span class="sourceLineNo">405</span>   */<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  private BitSetNode growNode(BitSetNode node, long procId) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    map.remove(node.getStart());<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    node.grow(procId);<a name="line.408"></a>
+<span class="sourceLineNo">402</span>    // grow the right node<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    if (rightCanGrow) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      return growNode(rightNode, procId);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    }<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    // add new node if there are no left/right nodes which can be used.<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    BitSetNode node = new BitSetNode(procId, partial);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>    map.put(node.getStart(), node);<a name="line.409"></a>
 <span class="sourceLineNo">410</span>    return node;<a name="line.410"></a>
 <span class="sourceLineNo">411</span>  }<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>   * Merges {@code leftNode} &amp; {@code rightNode} and updates the map.<a name="line.414"></a>
-<span class="sourceLineNo">415</span>   */<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private BitSetNode mergeNodes(BitSetNode leftNode, BitSetNode rightNode) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assert leftNode.getStart() &lt; rightNode.getStart();<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    leftNode.merge(rightNode);<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    map.remove(rightNode.getStart());<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    return leftNode;<a name="line.420"></a>
-<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
-<span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>  public void dump() {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    System.out.println("map " + map.size());<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    System.out.println("isAllModified " + isAllModified());<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    System.out.println("isEmpty " + isEmpty());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      entry.getValue().dump();<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><a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // ========================================================================<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  //  Convert to/from Protocol Buffer.<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>  /**<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   * Builds<a name="line.437"></a>
-<span class="sourceLineNo">438</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker<a name="line.438"></a>
-<span class="sourceLineNo">439</span>   * protocol buffer from current state.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>   */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public ProcedureProtos.ProcedureStoreTracker toProto() throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    ProcedureProtos.ProcedureStoreTracker.Builder builder =<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        ProcedureProtos.ProcedureStoreTracker.newBuilder();<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      builder.addNode(entry.getValue().convert());<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    return builder.build();<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>}<a name="line.449"></a>
+<span class="sourceLineNo">414</span>   * Grows {@code node} to contain {@code procId} and updates the map.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * @return {@link BitSetNode} instance which contains {@code procId}.<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   */<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  private BitSetNode growNode(BitSetNode node, long procId) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    map.remove(node.getStart());<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    node.grow(procId);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    map.put(node.getStart(), node);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return node;<a name="line.421"></a>
+<span class="sourceLineNo">422</span>  }<a name="line.422"></a>
+<span class="sourceLineNo">423</span><a name="line.423"></a>
+<span class="sourceLineNo">424</span>  /**<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   * Merges {@code leftNode} &amp; {@code rightNode} and updates the map.<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   */<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  private BitSetNode mergeNodes(BitSetNode leftNode, BitSetNode rightNode) {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>    assert leftNode.getStart() &lt; rightNode.getStart();<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    leftNode.merge(rightNode);<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    map.remove(rightNode.getStart());<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    return leftNode;<a name="line.431"></a>
+<span class="sourceLineNo">432</span>  }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>  public void dump() {<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    System.out.println("map " + map.size());<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    System.out.println("isAllModified " + isAllModified());<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    System.out.println("isEmpty " + isEmpty());<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>      entry.getValue().dump();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    }<a name="line.440"></a>
+<span class="sourceLineNo">441</span>  }<a name="line.441"></a>
+<span class="sourceLineNo">442</span><a name="line.442"></a>
+<span class="sourceLineNo">443</span>  // ========================================================================<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  //  Convert to/from Protocol Buffer.<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  // ========================================================================<a name="line.445"></a>
+<span class="sourceLineNo">446</span><a name="line.446"></a>
+<span class="sourceLineNo">447</span>  /**<a name="line.447"></a>
+<span class="sourceLineNo">448</span>   * Builds<a name="line.448"></a>
+<span class="sourceLineNo">449</span>   * org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker<a name="line.449"></a>
+<span class="sourceLineNo">450</span>   * protocol buffer from current state.<a name="line.450"></a>
+<span class="sourceLineNo">451</span>   */<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public ProcedureProtos.ProcedureStoreTracker toProto() throws IOException {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    ProcedureProtos.ProcedureStoreTracker.Builder builder =<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        ProcedureProtos.ProcedureStoreTracker.newBuilder();<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    for (Map.Entry&lt;Long, BitSetNode&gt; entry : map.entrySet()) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      builder.addNode(entry.getValue().convert());<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return builder.build();<a name="line.458"></a>
+<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
+<span class="sourceLineNo">460</span>}<a name="line.460"></a>
 
 
 


[08/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
index 2142742..be2a512 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.IdentityGroupingStrategy.html
@@ -129,174 +129,171 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
-<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return getWAL(group);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        failure = e;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return provider;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (failure != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      throw failure;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return logFileSize;<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 void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    listeners.add(listener);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>}<a name="line.291"></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>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    listeners.add(listener);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>}<a name="line.288"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
index 2142742..be2a512 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html
@@ -129,174 +129,171 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
-<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return getWAL(group);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        failure = e;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return provider;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (failure != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      throw failure;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return logFileSize;<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 void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    listeners.add(listener);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>}<a name="line.291"></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>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    listeners.add(listener);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>}<a name="line.288"></a>
 
 
 


[43/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 325652f..fc48127 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -217,10 +217,10 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
-<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/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/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
index 6a58652..40697d7 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10};
+var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,7 +110,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.53">BitSetNode</a>
+class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.55">BitSetNode</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">A bitmap which can grow/merge with other <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store"><code>BitSetNode</code></a> (if certain conditions are met).
  Boundaries of bitmap are aligned to multiples of <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#BITS_PER_WORD"><code>BITS_PER_WORD</code></a>. So the range
@@ -279,58 +279,62 @@ 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/store/BitSetNode.html#getActiveMinProcId--">getActiveMinProcId</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i10" class="altColor">
+<td class="colFirst"><code>long[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#getActiveProcIds--">getActiveProcIds</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>private int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#getBitmapIndex-long-">getBitmapIndex</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#getEnd--">getEnd</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#getStart--">getStart</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#grow-long-">grow</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#insertOrUpdate-long-">insertOrUpdate</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#isAllModified--">isAllModified</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#isDeleted-long-">isDeleted</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#isEmpty--">isEmpty</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#isModified-long-">isModified</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#merge-org.apache.hadoop.hbase.procedure2.store.BitSetNode-">merge</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#resetModified--">resetModified</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code><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/store/BitSetNode.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#unsetPartialFlag--">unsetPartialFlag</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#updateState-long-boolean-">updateState</a></span>(long&nbsp;procId,
            boolean&nbsp;isDeleted)</code>&nbsp;</td>
@@ -363,7 +367,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WORD_MASK</h4>
-<pre>private static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.54">WORD_MASK</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.56">WORD_MASK</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.BitSetNode.WORD_MASK">Constant Field Values</a></dd>
@@ -376,7 +380,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>ADDRESS_BITS_PER_WORD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.55">ADDRESS_BITS_PER_WORD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.57">ADDRESS_BITS_PER_WORD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.BitSetNode.ADDRESS_BITS_PER_WORD">Constant Field Values</a></dd>
@@ -389,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>BITS_PER_WORD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.56">BITS_PER_WORD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.58">BITS_PER_WORD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.BitSetNode.BITS_PER_WORD">Constant Field Values</a></dd>
@@ -402,7 +406,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_NODE_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.57">MAX_NODE_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.59">MAX_NODE_SIZE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.store.BitSetNode.MAX_NODE_SIZE">Constant Field Values</a></dd>
@@ -415,7 +419,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>partial</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.63">partial</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.65">partial</a></pre>
 <div class="block">Mimics <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#partial"><code>ProcedureStoreTracker.partial</code></a>. It will effect how we fill the new deleted bits
  when growing.</div>
 </li>
@@ -426,7 +430,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>modified</h4>
-<pre>private&nbsp;long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.69">modified</a></pre>
+<pre>private&nbsp;long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.71">modified</a></pre>
 <div class="block">Set of procedures which have been modified since last <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#resetModified--"><code>resetModified()</code></a>. Useful to track
  procedures which have been modified since last WAL write.</div>
 </li>
@@ -437,7 +441,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>deleted</h4>
-<pre>private&nbsp;long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.75">deleted</a></pre>
+<pre>private&nbsp;long[] <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.77">deleted</a></pre>
 <div class="block">Keeps track of procedure ids which belong to this bitmap's range and have been deleted. This
  represents global state since it's not reset on WAL rolls.</div>
 </li>
@@ -448,7 +452,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>start</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.79">start</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.81">start</a></pre>
 <div class="block">Offset of bitmap i.e. procedure id corresponding to first bit.</div>
 </li>
 </ul>
@@ -466,7 +470,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>BitSetNode</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.102">BitSetNode</a>(long&nbsp;procId,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.104">BitSetNode</a>(long&nbsp;procId,
                   boolean&nbsp;partial)</pre>
 </li>
 </ul>
@@ -476,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>BitSetNode</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.116">BitSetNode</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode&nbsp;data)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.118">BitSetNode</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode&nbsp;data)</pre>
 </li>
 </ul>
 <a name="BitSetNode-org.apache.hadoop.hbase.procedure2.store.BitSetNode-boolean-">
@@ -485,7 +489,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BitSetNode</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.129">BitSetNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;other,
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.131">BitSetNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;other,
                   boolean&nbsp;resetDelete)</pre>
 </li>
 </ul>
@@ -503,7 +507,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>dump</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.81">dump</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.83">dump</a>()</pre>
 </li>
 </ul>
 <a name="insertOrUpdate-long-">
@@ -512,7 +516,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insertOrUpdate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.148">insertOrUpdate</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.150">insertOrUpdate</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="delete-long-">
@@ -521,7 +525,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.152">delete</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.154">delete</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="getStart--">
@@ -530,7 +534,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStart</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.156">getStart</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.158">getStart</a>()</pre>
 </li>
 </ul>
 <a name="getEnd--">
@@ -539,7 +543,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getEnd</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.160">getEnd</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.162">getEnd</a>()</pre>
 </li>
 </ul>
 <a name="contains-long-">
@@ -548,7 +552,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>contains</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.164">contains</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.166">contains</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isDeleted-long-">
@@ -557,7 +561,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isDeleted</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.168">isDeleted</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.170">isDeleted</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isModified-long-">
@@ -566,7 +570,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isModified</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.177">isModified</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.179">isModified</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isAllModified--">
@@ -575,20 +579,33 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllModified</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.189">isAllModified</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.191">isAllModified</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true, if all the procedures has been modified.</dd>
 </dl>
 </li>
 </ul>
+<a name="getActiveProcIds--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getActiveProcIds</h4>
+<pre>public&nbsp;long[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.204">getActiveProcIds</a>()</pre>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>all the active procedure ids in this bit set.</dd>
+</dl>
+</li>
+</ul>
 <a name="isEmpty--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.202">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.225">isEmpty</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true, if there are no active procedures in this BitSetNode, else false.</dd>
@@ -601,7 +618,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetModified</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.212">resetModified</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.235">resetModified</a>()</pre>
 </li>
 </ul>
 <a name="unsetPartialFlag--">
@@ -610,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>unsetPartialFlag</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.216">unsetPartialFlag</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.239">unsetPartialFlag</a>()</pre>
 </li>
 </ul>
 <a name="convert--">
@@ -619,7 +636,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>convert</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.232">convert</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.255">convert</a>()</pre>
 <div class="block">Convert to
  org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker.TrackerNode
  protobuf.</div>
@@ -631,7 +648,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>canGrow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.246">canGrow</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.269">canGrow</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="canMerge-org.apache.hadoop.hbase.procedure2.store.BitSetNode-">
@@ -640,7 +657,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>canMerge</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.250">canMerge</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.273">canMerge</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</pre>
 </li>
 </ul>
 <a name="grow-long-">
@@ -649,7 +666,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>grow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.256">grow</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.279">grow</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="merge-org.apache.hadoop.hbase.procedure2.store.BitSetNode-">
@@ -658,7 +675,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>merge</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.290">merge</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.313">merge</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</pre>
 </li>
 </ul>
 <a name="toString--">
@@ -667,7 +684,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.315">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.338">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -680,7 +697,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveMinProcId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.322">getActiveMinProcId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.345">getActiveMinProcId</a>()</pre>
 </li>
 </ul>
 <a name="getActiveMaxProcId--">
@@ -689,7 +706,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveMaxProcId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.342">getActiveMaxProcId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.365">getActiveMaxProcId</a>()</pre>
 </li>
 </ul>
 <a name="getBitmapIndex-long-">
@@ -698,7 +715,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getBitmapIndex</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.364">getBitmapIndex</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.387">getBitmapIndex</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="updateState-long-boolean-">
@@ -707,7 +724,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateState</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.368">updateState</a>(long&nbsp;procId,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.391">updateState</a>(long&nbsp;procId,
                  boolean&nbsp;isDeleted)</pre>
 </li>
 </ul>
@@ -717,7 +734,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>alignUp</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.387">alignUp</a>(long&nbsp;x)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.410">alignUp</a>(long&nbsp;x)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>upper boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.</dd>
@@ -730,7 +747,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>alignDown</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.394">alignDown</a>(long&nbsp;x)</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#line.417">alignDown</a>(long&nbsp;x)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>lower boundary (aligned to multiple of BITS_PER_WORD) of bitmap range x belongs to.</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/NoopProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/NoopProcedureStore.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/NoopProcedureStore.html
index 3b50716..d56c631 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/NoopProcedureStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/NoopProcedureStore.html
@@ -274,7 +274,7 @@ extends <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/Proc
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.store.<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreBase</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#isRunning--">isRunning</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#registerListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">registerListener</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendAbortProcessSignal--">sendAbortProcessSignal</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#setRunning-boolean-">setRunning</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#unregisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">unregisterListener</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#isRunning--">isRunning</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#registerListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">registerListener</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendAbortProcessSignal--">sendAbortProcessSignal</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendForceUpdateSignal-long:A-">sendForceUpdateSignal</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#setRunning-boolean-">setRunning</a>, <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#unre
 gisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">unregisterListener</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
index 00cf7f6..1ab97cb 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.55">ProcedureStore.ProcedureIterator</a></pre>
+<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.73">ProcedureStore.ProcedureIterator</a></pre>
 <div class="block">An Iterator over a collection of Procedure</div>
 </li>
 </ul>
@@ -178,7 +178,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>reset</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.59">reset</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.77">reset</a>()</pre>
 <div class="block">Reset the Iterator by seeking to the beginning of the list.</div>
 </li>
 </ul>
@@ -188,7 +188,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>hasNext</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.67">hasNext</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.85">hasNext</a>()</pre>
 <div class="block">Returns true if the iterator has more elements.
  (In other words, returns true if next() would return a Procedure
  rather than throwing an exception.)</div>
@@ -204,7 +204,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>isNextFinished</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.72">isNextFinished</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.90">isNextFinished</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the iterator next element is a completed procedure.</dd>
@@ -217,7 +217,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>skipNext</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.77">skipNext</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.95">skipNext</a>()</pre>
 <div class="block">Skip the next procedure</div>
 </li>
 </ul>
@@ -227,7 +227,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>next</h4>
-<pre><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/procedure2/store/ProcedureStore.ProcedureIterator.html#line.85">next</a>()
+<pre><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/procedure2/store/ProcedureStore.ProcedureIterator.html#line.103">next</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Returns the next procedure in the iteration.</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
index 1464316..e29217f 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.91">ProcedureStore.ProcedureLoader</a></pre>
+<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.109">ProcedureStore.ProcedureLoader</a></pre>
 <div class="block">Interface passed to the ProcedureStore.load() method to handle the store-load events.</div>
 </li>
 </ul>
@@ -169,7 +169,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>setMaxProcId</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.96">setMaxProcId</a>(long&nbsp;maxProcId)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.114">setMaxProcId</a>(long&nbsp;maxProcId)</pre>
 <div class="block">Called by ProcedureStore.load() to notify about the maximum proc-id in the store.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -183,7 +183,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.103">load</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.121">load</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter)
    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">Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.
  The ProcedureIterator passed to the method, has the procedure sorted in replay-order.</div>
@@ -201,7 +201,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>handleCorrupted</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.110">handleCorrupted</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html#line.128">handleCorrupted</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a>&nbsp;procIter)
               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">Called by the ProcedureStore.load() in case we have procedures not-ready to be added to
  the executor, which probably means they are corrupted since some information/link is missing.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
index a91c472..e6473c4 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
@@ -18,8 +18,8 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":6,"i1":6};
-var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"]};
+var methods = {"i0":18,"i1":18,"i2":18};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],16:["t5","Default Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
 var tableTab = "tableTab";
@@ -100,17 +100,14 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <dl>
-<dt>All Known Implementing Classes:</dt>
-<dd><a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></dd>
-</dl>
-<dl>
 <dt>Enclosing interface:</dt>
 <dd><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a></dd>
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.39">ProcedureStore.ProcedureStoreListener</a></pre>
+<pre>public static interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.40">ProcedureStore.ProcedureStoreListener</a></pre>
 <div class="block">Store listener interface.
+ <p/>
  The main process should register a listener and respond to the store events.</div>
 </li>
 </ul>
@@ -125,19 +122,25 @@ var activeTableTab = "activeTableTab";
 </a>
 <h3>Method Summary</h3>
 <table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
-<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t5" class="tableTab"><span><a href="javascript:show(16);">Default Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>void</code></td>
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#abortProcess--">abortProcess</a></span>()</code>
 <div class="block">triggered when the store is not able to write out data.</div>
 </td>
 </tr>
 <tr id="i1" class="rowColor">
-<td class="colFirst"><code>void</code></td>
+<td class="colFirst"><code>default void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#forceUpdate-long:A-">forceUpdate</a></span>(long[]&nbsp;procIds)</code>
+<div class="block">Suggest that the upper layer should update the state of some procedures.</div>
+</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#postSync--">postSync</a></span>()</code>
 <div class="block">triggered when the store sync is completed.</div>
 </td>
@@ -163,19 +166,40 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>postSync</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#line.43">postSync</a>()</pre>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#line.45">postSync</a>()</pre>
 <div class="block">triggered when the store sync is completed.</div>
 </li>
 </ul>
 <a name="abortProcess--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>abortProcess</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#line.49">abortProcess</a>()</pre>
-<div class="block">triggered when the store is not able to write out data.
- the main process should abort.</div>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#line.51">abortProcess</a>()</pre>
+<div class="block">triggered when the store is not able to write out data. the main process should abort.</div>
+</li>
+</ul>
+<a name="forceUpdate-long:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>forceUpdate</h4>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#line.66">forceUpdate</a>(long[]&nbsp;procIds)</pre>
+<div class="block">Suggest that the upper layer should update the state of some procedures. Ignore this call
+ will not effect correctness but performance.
+ <p/>
+ For a WAL based ProcedureStore implementation, if all the procedures stored in a WAL file
+ have been deleted, or updated later in another WAL file, then we can delete the WAL file. If
+ there are old procedures in a WAL file which are never deleted or updated, then we can not
+ delete the WAL file and this will cause we hold lots of WAL file and slow down the master
+ restarts. So here we introduce this method to tell the upper layer that please update the
+ states of these procedures so that we can delete the old WAL file.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>procIds</code> - the id for the procedures</dd>
+</dl>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
index 738a2dc..033d4aa 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
@@ -276,7 +276,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>registerListener</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.117">registerListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.135">registerListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
 <div class="block">Add the listener to the notification list.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -290,7 +290,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterListener</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.124">unregisterListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.142">unregisterListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
 <div class="block">Remove the listener from the notification list.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -306,7 +306,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.130">start</a>(int&nbsp;numThreads)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.148">start</a>(int&nbsp;numThreads)
     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">Start/Open the procedure store</div>
 <dl>
@@ -323,7 +323,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>stop</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.136">stop</a>(boolean&nbsp;abort)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.154">stop</a>(boolean&nbsp;abort)</pre>
 <div class="block">Stop/Close the procedure store</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -337,7 +337,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.141">isRunning</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.159">isRunning</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if the store is running, otherwise false.</dd>
@@ -350,7 +350,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumThreads</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.146">getNumThreads</a>()</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.164">getNumThreads</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of threads/slots passed to start()</dd>
@@ -363,7 +363,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>setRunningProcedureCount</h4>
-<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.153">setRunningProcedureCount</a>(int&nbsp;count)</pre>
+<pre>int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.171">setRunningProcedureCount</a>(int&nbsp;count)</pre>
 <div class="block">Set the number of procedure running.
  This can be used, for example, by the store to know how long to wait before a sync.</div>
 <dl>
@@ -378,7 +378,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>recoverLease</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.158">recoverLease</a>()
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.176">recoverLease</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Acquire the lease for the procedure store.</div>
 <dl>
@@ -393,7 +393,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>load</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.164">load</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.182">load</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureLoader</a>&nbsp;loader)
    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">Load the Procedures in the store.</div>
 <dl>
@@ -410,7 +410,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.177">insert</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>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.195">insert</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc,
             <a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;subprocs)</pre>
 <div class="block">When a procedure is submitted to the executor insert(proc, null) will be called.
  'proc' has a 'RUNNABLE' state and the initial information required to start up.
@@ -431,7 +431,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.186">insert</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.204">insert</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;[]&nbsp;procs)</pre>
 <div class="block">Serialize a set of new procedures.
  These procedures are freshly submitted to the executor and each procedure
  has a 'RUNNABLE' state and the initial information required to start up.</div>
@@ -447,7 +447,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.193">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.211">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;proc)</pre>
 <div class="block">The specified procedure was executed,
  and the new state should be written to the store.</div>
 <dl>
@@ -462,7 +462,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.201">delete</a>(long&nbsp;procId)</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.219">delete</a>(long&nbsp;procId)</pre>
 <div class="block">The specified procId was removed from the executor,
  due to completion, abort or failure.
  The store implementor should remove all the information about the specified procId.</div>
@@ -478,7 +478,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.209">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;parentProc,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.227">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;?&gt;&nbsp;parentProc,
             long[]&nbsp;subProcIds)</pre>
 <div class="block">The parent procedure completed.
  Update the state and mark all the child deleted.</div>
@@ -495,7 +495,7 @@ public interface <a href="../../../../../../src-html/org/apache/hadoop/hbase/pro
 <ul class="blockListLast">
 <li class="blockList">
 <h4>delete</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.219">delete</a>(long[]&nbsp;procIds,
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#line.237">delete</a>(long[]&nbsp;procIds,
             int&nbsp;offset,
             int&nbsp;count)</pre>
 <div class="block">The specified procIds were removed from the executor,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
index c2bb6fa..8243ae8 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Private
-public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.30">ProcedureStoreBase</a>
+public abstract class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.28">ProcedureStoreBase</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/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a></pre>
 <div class="block">Base class for <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store"><code>ProcedureStore</code></a>s.</div>
@@ -211,9 +211,13 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 </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/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendForceUpdateSignal-long:A-">sendForceUpdateSignal</a></span>(long[]&nbsp;procIds)</code>&nbsp;</td>
 </tr>
 <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/procedure2/store/ProcedureStoreBase.html#sendPostSyncSignal--">sendPostSyncSignal</a></span>()</code>&nbsp;</td>
+</tr>
+<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/procedure2/store/ProcedureStoreBase.html#setRunning-boolean-">setRunning</a></span>(boolean&nbsp;isRunning)</code>
 <div class="block">Change the state to 'isRunning',
@@ -221,7 +225,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
  false if the store was already in that state.</div>
 </td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#unregisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">unregisterListener</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</code>
 <div class="block">Remove the listener from the notification list.</div>
@@ -262,7 +266,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>listeners</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.31">listeners</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArrayList.html?is-external=true" title="class or interface in java.util.concurrent">CopyOnWriteArrayList</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.29">listeners</a></pre>
 </li>
 </ul>
 <a name="running">
@@ -271,7 +275,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>running</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.33">running</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicBoolean.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicBoolean</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.31">running</a></pre>
 </li>
 </ul>
 </li>
@@ -288,7 +292,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ProcedureStoreBase</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.30">ProcedureStoreBase</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.28">ProcedureStoreBase</a>()</pre>
 </li>
 </ul>
 </li>
@@ -305,7 +309,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>setRunning</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.42">setRunning</a>(boolean&nbsp;isRunning)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.40">setRunning</a>(boolean&nbsp;isRunning)</pre>
 <div class="block">Change the state to 'isRunning',
  returns true if the store state was changed,
  false if the store was already in that state.</div>
@@ -323,7 +327,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.47">isRunning</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.45">isRunning</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#isRunning--">isRunning</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a></code></dd>
@@ -338,7 +342,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>registerListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.52">registerListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.50">registerListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#registerListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">ProcedureStore</a></code></span></div>
 <div class="block">Add the listener to the notification list.</div>
 <dl>
@@ -355,7 +359,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterListener</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.57">unregisterListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.55">unregisterListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html#unregisterListener-org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener-">ProcedureStore</a></code></span></div>
 <div class="block">Remove the listener from the notification list.</div>
 <dl>
@@ -374,16 +378,25 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/P
 <ul class="blockList">
 <li class="blockList">
 <h4>sendPostSyncSignal</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.61">sendPostSyncSignal</a>()</pre>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.59">sendPostSyncSignal</a>()</pre>
 </li>
 </ul>
 <a name="sendAbortProcessSignal--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>sendAbortProcessSignal</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.69">sendAbortProcessSignal</a>()</pre>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.63">sendAbortProcessSignal</a>()</pre>
+</li>
+</ul>
+<a name="sendForceUpdateSignal-long:A-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>sendForceUpdateSignal</h4>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#line.67">sendForceUpdateSignal</a>(long[]&nbsp;procIds)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
index 12c0a48..f7cd504 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.61">ProcedureStoreTracker.DeleteState</a>
+<pre>public static enum <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.62">ProcedureStoreTracker.DeleteState</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/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&gt;</pre>
 </li>
 </ul>
@@ -213,7 +213,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>YES</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.61">YES</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.62">YES</a></pre>
 </li>
 </ul>
 <a name="NO">
@@ -222,7 +222,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>NO</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.61">NO</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.62">NO</a></pre>
 </li>
 </ul>
 <a name="MAYBE">
@@ -231,7 +231,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MAYBE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.61">MAYBE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.62">MAYBE</a></pre>
 </li>
 </ul>
 </li>
@@ -248,7 +248,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.61">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.62">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -268,7 +268,7 @@ for (ProcedureStoreTracker.DeleteState c : ProcedureStoreTracker.DeleteState.val
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.61">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html#line.62">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 


[42/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
index 3698107..74eef36 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -111,7 +111,7 @@ var activeTableTab = "activeTableTab";
 <br>
 <pre>@InterfaceAudience.Private
  @InterfaceStability.Evolving
-public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.39">ProcedureStoreTracker</a>
+public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.40">ProcedureStoreTracker</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">Keeps track of live procedures.
 
@@ -232,95 +232,101 @@ 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/store/ProcedureStoreTracker.html#getActiveMinProcId--">getActiveMinProcId</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
+<td class="colFirst"><code>long[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#getAllActiveProcIds--">getAllActiveProcIds</a></span>()</code>
+<div class="block">Will be used when there are too many proc wal files.</div>
+</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#getModifiedMaxProcId--">getModifiedMaxProcId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#getModifiedMinProcId--">getModifiedMinProcId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#getOrCreateNode-long-">getOrCreateNode</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#growNode-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">growNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
         long&nbsp;procId)</code>
 <div class="block">Grows <code>node</code> to contain <code>procId</code> and updates the map.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#insert-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">insert</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
       long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#insert-long-">insert</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#insert-long:A-">insert</a></span>(long[]&nbsp;procIds)</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#insert-long-long:A-">insert</a></span>(long&nbsp;procId,
       long[]&nbsp;subProcIds)</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isAllModified--">isAllModified</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isDeleted-long-">isDeleted</a></span>(long&nbsp;procId)</code>
 <div class="block">If <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#partial"><code>partial</code></a> is false, returns state from the bitmap.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isEmpty--">isEmpty</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isModified-long-">isModified</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isPartial--">isPartial</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#lookupClosestNode-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">lookupClosestNode</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                  long&nbsp;procId)</code>
 <div class="block">lookup the node containing the specified procId.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#mergeNodes-org.apache.hadoop.hbase.procedure2.store.BitSetNode-org.apache.hadoop.hbase.procedure2.store.BitSetNode-">mergeNodes</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;leftNode,
           <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</code>
 <div class="block">Merges <code>leftNode</code> & <code>rightNode</code> and updates the map.</div>
 </td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#reset--">reset</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#resetModified--">resetModified</a></span>()</code>
 <div class="block">Clears the list of updated procedure ids.</div>
 </td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#resetTo-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-">resetTo</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</code>
 <div class="block">Resets internal state to same as given <code>tracker</code>.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#resetTo-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-boolean-">resetTo</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker,
        boolean&nbsp;resetDelete)</code>
@@ -328,46 +334,46 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  to the modified flag if <code>resetDelete</code> is true.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#resetToProto-org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker-">resetToProto</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker&nbsp;trackerProtoBuf)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeleted-long-boolean-">setDeleted</a></span>(long&nbsp;procId,
           boolean&nbsp;isDeleted)</code>
 <div class="block">This method is used when restarting where we need to rebuild the ProcedureStoreTracker.</div>
 </td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeletedIfModified-long...-">setDeletedIfModified</a></span>(long...&nbsp;procId)</code>
 <div class="block">Set the given bit for the procId to delete if it was modified before.</div>
 </td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeletedIfModifiedInBoth-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-">setDeletedIfModifiedInBoth</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</code>
 <div class="block">Similar with <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeletedIfModified-long...-"><code>setDeletedIfModified(long...)</code></a>, but here the <code>procId</code> are given by
  the <code>tracker</code>.</div>
 </td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setKeepDeletes-boolean-">setKeepDeletes</a></span>(boolean&nbsp;keepDeletes)</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setMinMaxModifiedProcIds-long-long-">setMinMaxModifiedProcIds</a></span>(long&nbsp;min,
                         long&nbsp;max)</code>
 <div class="block">Will be called when restarting where we need to rebuild the ProcedureStoreTracker.</div>
 </td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setPartialFlag-boolean-">setPartialFlag</a></span>(boolean&nbsp;isPartial)</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#toProto--">toProto</a></span>()</code>
 <div class="block">Builds
@@ -375,16 +381,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
  protocol buffer from current state.</div>
 </td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#trackProcIds-long-">trackProcIds</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>private <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#update-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">update</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
       long&nbsp;procId)</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#update-long-">update</a></span>(long&nbsp;procId)</code>&nbsp;</td>
 </tr>
@@ -416,7 +422,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>map</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.41">map</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html?is-external=true" title="class or interface in java.util">TreeMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.42">map</a></pre>
 </li>
 </ul>
 <a name="keepDeletes">
@@ -425,7 +431,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>keepDeletes</h4>
-<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.50">keepDeletes</a></pre>
+<pre>private&nbsp;boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.51">keepDeletes</a></pre>
 <div class="block">If true, do not remove bits corresponding to deleted procedures. Note that this can result
  in huge bitmaps overtime.
  Currently, it's set to true only when building tracker state from logs during recovery. During
@@ -439,7 +445,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>partial</h4>
-<pre>boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.56">partial</a></pre>
+<pre>boolean <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.57">partial</a></pre>
 <div class="block">If true, it means tracker has incomplete information about the active/deleted procedures.
  It's set to true only when recovering from old logs. See <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#isDeleted-long-"><code>isDeleted(long)</code></a> docs to
  understand it's real use.</div>
@@ -451,7 +457,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>minModifiedProcId</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.58">minModifiedProcId</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.59">minModifiedProcId</a></pre>
 </li>
 </ul>
 <a name="maxModifiedProcId">
@@ -460,7 +466,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>maxModifiedProcId</h4>
-<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.59">maxModifiedProcId</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.60">maxModifiedProcId</a></pre>
 </li>
 </ul>
 </li>
@@ -477,7 +483,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ProcedureStoreTracker</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.39">ProcedureStoreTracker</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.40">ProcedureStoreTracker</a>()</pre>
 </li>
 </ul>
 </li>
@@ -494,7 +500,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetToProto</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.63">resetToProto</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker&nbsp;trackerProtoBuf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.64">resetToProto</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker&nbsp;trackerProtoBuf)</pre>
 </li>
 </ul>
 <a name="resetTo-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-">
@@ -503,7 +509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetTo</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.74">resetTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.75">resetTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</pre>
 <div class="block">Resets internal state to same as given <code>tracker</code>. Does deep copy of the bitmap.</div>
 </li>
 </ul>
@@ -513,7 +519,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>resetTo</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.86">resetTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.87">resetTo</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker,
                     boolean&nbsp;resetDelete)</pre>
 <div class="block">Resets internal state to same as given <code>tracker</code>, and change the deleted flag according
  to the modified flag if <code>resetDelete</code> is true. Does deep copy of the bitmap.
@@ -529,7 +535,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.97">insert</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.98">insert</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="insert-long:A-">
@@ -538,7 +544,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.101">insert</a>(long[]&nbsp;procIds)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.102">insert</a>(long[]&nbsp;procIds)</pre>
 </li>
 </ul>
 <a name="insert-long-long:A-">
@@ -547,7 +553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.107">insert</a>(long&nbsp;procId,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.108">insert</a>(long&nbsp;procId,
                    long[]&nbsp;subProcIds)</pre>
 </li>
 </ul>
@@ -557,7 +563,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>insert</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.114">insert</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.115">insert</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                           long&nbsp;procId)</pre>
 </li>
 </ul>
@@ -567,7 +573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.123">update</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.124">update</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="update-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">
@@ -576,7 +582,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>update</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.127">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.128">update</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                           long&nbsp;procId)</pre>
 </li>
 </ul>
@@ -586,7 +592,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.136">delete</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.137">delete</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="delete-long:A-">
@@ -595,7 +601,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.140">delete</a>(long[]&nbsp;procIds)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.141">delete</a>(long[]&nbsp;procIds)</pre>
 </li>
 </ul>
 <a name="delete-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">
@@ -604,7 +610,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>delete</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.148">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.149">delete</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                           long&nbsp;procId)</pre>
 </li>
 </ul>
@@ -614,7 +620,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setMinMaxModifiedProcIds</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.165">setMinMaxModifiedProcIds</a>(long&nbsp;min,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.166">setMinMaxModifiedProcIds</a>(long&nbsp;min,
                                      long&nbsp;max)</pre>
 <div class="block">Will be called when restarting where we need to rebuild the ProcedureStoreTracker.</div>
 </li>
@@ -625,7 +631,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setDeleted</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.174">setDeleted</a>(long&nbsp;procId,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.175">setDeleted</a>(long&nbsp;procId,
                        boolean&nbsp;isDeleted)</pre>
 <div class="block">This method is used when restarting where we need to rebuild the ProcedureStoreTracker. The
  <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#delete-long-"><code>delete(long)</code></a> method above assume that the <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store"><code>BitSetNode</code></a> exists, but when restart
@@ -638,7 +644,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setDeletedIfModified</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.188">setDeletedIfModified</a>(long...&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.189">setDeletedIfModified</a>(long...&nbsp;procId)</pre>
 <div class="block">Set the given bit for the procId to delete if it was modified before.
  <p/>
  This method is used to test whether a procedure wal file can be safely deleted, as if all the
@@ -652,7 +658,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setDeletedIfModifiedInBoth</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.204">setDeletedIfModifiedInBoth</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.205">setDeletedIfModifiedInBoth</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a>&nbsp;tracker)</pre>
 <div class="block">Similar with <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#setDeletedIfModified-long...-"><code>setDeletedIfModified(long...)</code></a>, but here the <code>procId</code> are given by
  the <code>tracker</code>. If a procedure is modified by us, and also by the given <code>tracker</code>,
  then we mark it as deleted.</div>
@@ -668,7 +674,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>lookupClosestNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.230">lookupClosestNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.231">lookupClosestNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                                      long&nbsp;procId)</pre>
 <div class="block">lookup the node containing the specified procId.</div>
 <dl>
@@ -686,7 +692,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>trackProcIds</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.236">trackProcIds</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.237">trackProcIds</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="getModifiedMinProcId--">
@@ -695,7 +701,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getModifiedMinProcId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.241">getModifiedMinProcId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.242">getModifiedMinProcId</a>()</pre>
 </li>
 </ul>
 <a name="getModifiedMaxProcId--">
@@ -704,7 +710,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getModifiedMaxProcId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.245">getModifiedMaxProcId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.246">getModifiedMaxProcId</a>()</pre>
 </li>
 </ul>
 <a name="reset--">
@@ -713,7 +719,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reset</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.249">reset</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.250">reset</a>()</pre>
 </li>
 </ul>
 <a name="isModified-long-">
@@ -722,7 +728,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isModified</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.256">isModified</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.257">isModified</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isDeleted-long-">
@@ -731,7 +737,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isDeleted</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.269">isDeleted</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.DeleteState.html" title="enum in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker.DeleteState</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.270">isDeleted</a>(long&nbsp;procId)</pre>
 <div class="block">If <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#partial"><code>partial</code></a> is false, returns state from the bitmap. If no state is found for
  <code>procId</code>, returns YES.
  If partial is true, tracker doesn't have complete view of system state, so it returns MAYBE
@@ -745,7 +751,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveMinProcId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.279">getActiveMinProcId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.280">getActiveMinProcId</a>()</pre>
 </li>
 </ul>
 <a name="setKeepDeletes-boolean-">
@@ -754,7 +760,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setKeepDeletes</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.285">setKeepDeletes</a>(boolean&nbsp;keepDeletes)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.286">setKeepDeletes</a>(boolean&nbsp;keepDeletes)</pre>
 </li>
 </ul>
 <a name="isPartial--">
@@ -763,7 +769,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isPartial</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.300">isPartial</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.301">isPartial</a>()</pre>
 </li>
 </ul>
 <a name="setPartialFlag-boolean-">
@@ -772,7 +778,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPartialFlag</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.304">setPartialFlag</a>(boolean&nbsp;isPartial)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.305">setPartialFlag</a>(boolean&nbsp;isPartial)</pre>
 </li>
 </ul>
 <a name="isEmpty--">
@@ -781,7 +787,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isEmpty</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.316">isEmpty</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.317">isEmpty</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true, if no procedure is active, else false.</dd>
@@ -794,7 +800,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllModified</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.329">isAllModified</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.330">isAllModified</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>true if all procedure was modified or deleted since last call to
@@ -802,13 +808,28 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="getAllActiveProcIds--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getAllActiveProcIds</h4>
+<pre>public&nbsp;long[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.344">getAllActiveProcIds</a>()</pre>
+<div class="block">Will be used when there are too many proc wal files. We will rewrite the states of the active
+ procedures in the oldest proc wal file so that we can delete it.</div>
+<dl>
+<dt><span class="returnLabel">Returns:</span></dt>
+<dd>all the active procedure ids in this tracker.</dd>
+</dl>
+</li>
+</ul>
 <a name="resetModified--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>resetModified</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.342">resetModified</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.353">resetModified</a>()</pre>
 <div class="block">Clears the list of updated procedure ids. This doesn't affect global list of active
  procedure ids.</div>
 </li>
@@ -819,7 +840,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrCreateNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.350">getOrCreateNode</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.361">getOrCreateNode</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="growNode-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">
@@ -828,7 +849,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>growNode</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.406">growNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.417">growNode</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;node,
                             long&nbsp;procId)</pre>
 <div class="block">Grows <code>node</code> to contain <code>procId</code> and updates the map.</div>
 <dl>
@@ -843,7 +864,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>mergeNodes</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.416">mergeNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;leftNode,
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.427">mergeNodes</a>(<a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;leftNode,
                               <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a>&nbsp;rightNode)</pre>
 <div class="block">Merges <code>leftNode</code> & <code>rightNode</code> and updates the map.</div>
 </li>
@@ -854,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>dump</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.423">dump</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.434">dump</a>()</pre>
 </li>
 </ul>
 <a name="toProto--">
@@ -863,7 +884,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toProto</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.441">toProto</a>()
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureStoreTracker&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#line.452">toProto</a>()
                                                                                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Builds
  org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.ProcedureStoreTracker

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html
index 974f198..7ca0e1b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html
@@ -83,10 +83,6 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<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="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2.store">org.apache.hadoop.hbase.procedure2.store</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
@@ -95,24 +91,6 @@
 </li>
 <li class="blockList">
 <ul class="blockList">
-<li class="blockList"><a name="org.apache.hadoop.hbase.master.procedure">
-<!--   -->
-</a>
-<h3>Uses of <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</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 classes, and an explanation">
-<caption><span>Classes in <a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a> that implement <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></span><span class="tabEnd">&nbsp;</span></caption>
-<tr>
-<th class="colFirst" scope="col">Modifier and Type</th>
-<th class="colLast" scope="col">Class and Description</th>
-</tr>
-<tbody>
-<tr class="altColor">
-<td class="colFirst"><code>static class&nbsp;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></span></code>&nbsp;</td>
-</tr>
-</tbody>
-</table>
-</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.procedure2.store">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/package-use.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/package-use.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/package-use.html
index 5698daf..3969cb6 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/package-use.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/package-use.html
@@ -83,41 +83,20 @@
 </tr>
 <tbody>
 <tr class="altColor">
-<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="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">
+<tr class="rowColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2.store">org.apache.hadoop.hbase.procedure2.store</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="#org.apache.hadoop.hbase.procedure2.store.wal">org.apache.hadoop.hbase.procedure2.store.wal</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
 </tbody>
 </table>
 </li>
-<li class="blockList"><a name="org.apache.hadoop.hbase.master.procedure">
-<!--   -->
-</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/procedure2/store/package-summary.html">org.apache.hadoop.hbase.procedure2.store</a> used by <a href="../../../../../../org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</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/procedure2/store/class-use/ProcedureStore.ProcedureStoreListener.html#org.apache.hadoop.hbase.master.procedure">ProcedureStore.ProcedureStoreListener</a>
-<div class="block">Store listener interface.</div>
-</td>
-</tr>
-</tbody>
-</table>
-</li>
 <li class="blockList"><a name="org.apache.hadoop.hbase.procedure2">
 <!--   -->
 </a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
index 18fbf6c..85760da 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.113">WALProcedureStore.LeaseRecovery</a></pre>
+<pre>public static interface <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.117">WALProcedureStore.LeaseRecovery</a></pre>
 </li>
 </ul>
 </div>
@@ -154,7 +154,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>recoverFileLease</h4>
-<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html#line.114">recoverFileLease</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html#line.118">recoverFileLease</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                       org.apache.hadoop.fs.Path&nbsp;path)
                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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
index 02fb9fa..c33fef5 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static enum <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.692">WALProcedureStore.PushType</a>
+<pre>private static enum <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.698">WALProcedureStore.PushType</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/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&gt;</pre>
 </li>
 </ul>
@@ -213,7 +213,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>INSERT</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.692">INSERT</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.698">INSERT</a></pre>
 </li>
 </ul>
 <a name="UPDATE">
@@ -222,7 +222,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>UPDATE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.692">UPDATE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.698">UPDATE</a></pre>
 </li>
 </ul>
 <a name="DELETE">
@@ -231,7 +231,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DELETE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.692">DELETE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a> <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.698">DELETE</a></pre>
 </li>
 </ul>
 </li>
@@ -248,7 +248,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.692">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.698">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -268,7 +268,7 @@ for (WALProcedureStore.PushType c : WALProcedureStore.PushType.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.692">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html" title="enum in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.PushType</a>&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html#line.698">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
index 003352a..68a6294 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.203">WALProcedureStore.SyncMetrics</a>
+<pre>public static class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#line.207">WALProcedureStore.SyncMetrics</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -233,7 +233,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>timestamp</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.204">timestamp</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.208">timestamp</a></pre>
 </li>
 </ul>
 <a name="syncWaitMs">
@@ -242,7 +242,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>syncWaitMs</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.205">syncWaitMs</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.209">syncWaitMs</a></pre>
 </li>
 </ul>
 <a name="totalSyncedBytes">
@@ -251,7 +251,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalSyncedBytes</h4>
-<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.206">totalSyncedBytes</a></pre>
+<pre>private&nbsp;long <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.210">totalSyncedBytes</a></pre>
 </li>
 </ul>
 <a name="syncedEntries">
@@ -260,7 +260,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>syncedEntries</h4>
-<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.207">syncedEntries</a></pre>
+<pre>private&nbsp;int <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.211">syncedEntries</a></pre>
 </li>
 </ul>
 <a name="syncedPerSec">
@@ -269,7 +269,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>syncedPerSec</h4>
-<pre>private&nbsp;float <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.208">syncedPerSec</a></pre>
+<pre>private&nbsp;float <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.212">syncedPerSec</a></pre>
 </li>
 </ul>
 </li>
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SyncMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.203">SyncMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.207">SyncMetrics</a>()</pre>
 </li>
 </ul>
 </li>
@@ -303,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTimestamp</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.210">getTimestamp</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.214">getTimestamp</a>()</pre>
 </li>
 </ul>
 <a name="getSyncWaitMs--">
@@ -312,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSyncWaitMs</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.214">getSyncWaitMs</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.218">getSyncWaitMs</a>()</pre>
 </li>
 </ul>
 <a name="getTotalSyncedBytes--">
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTotalSyncedBytes</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.218">getTotalSyncedBytes</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.222">getTotalSyncedBytes</a>()</pre>
 </li>
 </ul>
 <a name="getSyncedEntries--">
@@ -330,7 +330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSyncedEntries</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.222">getSyncedEntries</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.226">getSyncedEntries</a>()</pre>
 </li>
 </ul>
 <a name="getSyncedPerSec--">
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getSyncedPerSec</h4>
-<pre>public&nbsp;float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.226">getSyncedPerSec</a>()</pre>
+<pre>public&nbsp;float&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html#line.230">getSyncedPerSec</a>()</pre>
 </li>
 </ul>
 </li>


[45/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
index 8f27689..3f0afcb 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.202">ProcedureExecutor.CompletedProcedureCleaner</a>&lt;TEnvironment&gt;
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.206">ProcedureExecutor.CompletedProcedureCleaner</a>&lt;TEnvironment&gt;
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;TEnvironment&gt;</pre>
 <div class="block">Internal cleaner that removes the completed procedure results after a TTL.
  NOTE: This is a special case handled in timeoutLoop().
@@ -317,7 +317,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <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/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.204">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.208">LOG</a></pre>
 </li>
 </ul>
 <a name="CLEANER_INTERVAL_CONF_KEY">
@@ -326,7 +326,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>CLEANER_INTERVAL_CONF_KEY</h4>
-<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.206">CLEANER_INTERVAL_CONF_KEY</a></pre>
+<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.210">CLEANER_INTERVAL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.CLEANER_INTERVAL_CONF_KEY">Constant Field Values</a></dd>
@@ -339,7 +339,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_CLEANER_INTERVAL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.207">DEFAULT_CLEANER_INTERVAL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.211">DEFAULT_CLEANER_INTERVAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.DEFAULT_CLEANER_INTERVAL">Constant Field Values</a></dd>
@@ -352,7 +352,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>EVICT_TTL_CONF_KEY</h4>
-<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.209">EVICT_TTL_CONF_KEY</a></pre>
+<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.213">EVICT_TTL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.EVICT_TTL_CONF_KEY">Constant Field Values</a></dd>
@@ -365,7 +365,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_EVICT_TTL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.210">DEFAULT_EVICT_TTL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.214">DEFAULT_EVICT_TTL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.DEFAULT_EVICT_TTL">Constant Field Values</a></dd>
@@ -378,7 +378,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>EVICT_ACKED_TTL_CONF_KEY</h4>
-<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.212">EVICT_ACKED_TTL_CONF_KEY</a></pre>
+<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.216">EVICT_ACKED_TTL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.EVICT_ACKED_TTL_CONF_KEY">Constant Field Values</a></dd>
@@ -391,7 +391,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ACKED_EVICT_TTL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.213">DEFAULT_ACKED_EVICT_TTL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.217">DEFAULT_ACKED_EVICT_TTL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.DEFAULT_ACKED_EVICT_TTL">Constant Field Values</a></dd>
@@ -404,7 +404,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>BATCH_SIZE_CONF_KEY</h4>
-<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.215">BATCH_SIZE_CONF_KEY</a></pre>
+<pre>private 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/ProcedureExecutor.CompletedProcedureCleaner.html#line.219">BATCH_SIZE_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.BATCH_SIZE_CONF_KEY">Constant Field Values</a></dd>
@@ -417,7 +417,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_BATCH_SIZE</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.216">DEFAULT_BATCH_SIZE</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.220">DEFAULT_BATCH_SIZE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.CompletedProcedureCleaner.DEFAULT_BATCH_SIZE">Constant Field Values</a></dd>
@@ -430,7 +430,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>completed</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.218">completed</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.222">completed</a></pre>
 </li>
 </ul>
 <a name="nonceKeysToProcIdsMap">
@@ -439,7 +439,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>nonceKeysToProcIdsMap</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.219">nonceKeysToProcIdsMap</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.223">nonceKeysToProcIdsMap</a></pre>
 </li>
 </ul>
 <a name="store">
@@ -448,7 +448,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockList">
 <li class="blockList">
 <h4>store</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.220">store</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.224">store</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -457,7 +457,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.221">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.225">conf</a></pre>
 </li>
 </ul>
 </li>
@@ -474,7 +474,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CompletedProcedureCleaner</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.223">CompletedProcedureCleaner</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.227">CompletedProcedureCleaner</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                  <a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;store,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>,<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&gt;&gt;&nbsp;completedMap,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;nonceKeysToProcIdsMap)</pre>
@@ -496,7 +496,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>periodicExecute</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.235">periodicExecute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&nbsp;env)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html#line.239">periodicExecute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&nbsp;env)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html#periodicExecute-TEnvironment-">periodicExecute</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureInMemoryChore.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureInMemoryChore</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureCleaner.html" title="type parameter in ProcedureExecutor.CompletedProcedureCleaner">TEnvironment</a>&gt;</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
index ce1c9c8..e312d86 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.154">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;TEnvironment&gt;
+<pre>private static final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.158">ProcedureExecutor.CompletedProcedureRetainer</a>&lt;TEnvironment&gt;
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -223,7 +223,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procedure</h4>
-<pre>private final&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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.155">procedure</a></pre>
+<pre>private final&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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.159">procedure</a></pre>
 </li>
 </ul>
 <a name="clientAckTime">
@@ -232,7 +232,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>clientAckTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.156">clientAckTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.160">clientAckTime</a></pre>
 </li>
 </ul>
 </li>
@@ -249,7 +249,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CompletedProcedureRetainer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.158">CompletedProcedureRetainer</a>(<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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt;&nbsp;procedure)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.162">CompletedProcedureRetainer</a>(<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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt;&nbsp;procedure)</pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedure</h4>
-<pre>public&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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.163">getProcedure</a>()</pre>
+<pre>public&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/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html" title="type parameter in ProcedureExecutor.CompletedProcedureRetainer">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.167">getProcedure</a>()</pre>
 </li>
 </ul>
 <a name="hasClientAckTime--">
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>hasClientAckTime</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.167">hasClientAckTime</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.171">hasClientAckTime</a>()</pre>
 </li>
 </ul>
 <a name="getClientAckTime--">
@@ -284,7 +284,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getClientAckTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.171">getClientAckTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.175">getClientAckTime</a>()</pre>
 </li>
 </ul>
 <a name="setClientAckTime-long-">
@@ -293,7 +293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setClientAckTime</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.175">setClientAckTime</a>(long&nbsp;clientAckTime)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.179">setClientAckTime</a>(long&nbsp;clientAckTime)</pre>
 </li>
 </ul>
 <a name="isExpired-long-long-long-">
@@ -302,7 +302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isExpired</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.179">isExpired</a>(long&nbsp;now,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.CompletedProcedureRetainer.html#line.183">isExpired</a>(long&nbsp;now,
                          long&nbsp;evictTtl,
                          long&nbsp;evictAckTtl)</pre>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
index 69fc160..209f474 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.884">ProcedureExecutor.FailedProcedure</a>&lt;TEnvironment&gt;
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.922">ProcedureExecutor.FailedProcedure</a>&lt;TEnvironment&gt;
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&lt;TEnvironment&gt;</pre>
 </li>
 </ul>
@@ -279,7 +279,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>procName</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/procedure2/ProcedureExecutor.FailedProcedure.html#line.885">procName</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/procedure2/ProcedureExecutor.FailedProcedure.html#line.923">procName</a></pre>
 </li>
 </ul>
 </li>
@@ -296,7 +296,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>FailedProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.887">FailedProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.925">FailedProcedure</a>()</pre>
 </li>
 </ul>
 <a name="FailedProcedure-long-java.lang.String-org.apache.hadoop.hbase.security.User-org.apache.hadoop.hbase.util.NonceKey-java.io.IOException-">
@@ -305,7 +305,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FailedProcedure</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.890">FailedProcedure</a>(long&nbsp;procId,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.928">FailedProcedure</a>(long&nbsp;procId,
                        <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;procName,
                        <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;owner,
                        <a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
@@ -326,7 +326,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcName</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/procedure2/ProcedureExecutor.FailedProcedure.html#line.904">getProcName</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/procedure2/ProcedureExecutor.FailedProcedure.html#line.942">getProcName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html#getProcName--">getProcName</a></code>&nbsp;in class&nbsp;<code><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/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&gt;</code></dd>
@@ -341,7 +341,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <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/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&gt;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.909">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</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>&lt;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&gt;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.947">execute</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&nbsp;env)
                                      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>
@@ -373,7 +373,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>rollback</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.916">rollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&nbsp;env)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.954">rollback</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</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>
@@ -402,7 +402,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.922">abort</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</a>&nbsp;env)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.960">abort</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html" title="type parameter in ProcedureExecutor.FailedProcedure">TEnvironment</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
@@ -425,7 +425,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockList">
 <li class="blockList">
 <h4>serializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.927">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/procedure2/ProcedureExecutor.FailedProcedure.html#line.965">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
@@ -447,7 +447,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.htm
 <ul class="blockListLast">
 <li class="blockList">
 <h4>deserializeStateData</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.932">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/procedure2/ProcedureExecutor.FailedProcedure.html#line.970">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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
index f3764f6..ac2cded 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2054">ProcedureExecutor.KeepAliveWorkerThread</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2091">ProcedureExecutor.KeepAliveWorkerThread</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.WorkerThread</a></pre>
 </li>
 </ul>
@@ -252,7 +252,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExec
 <ul class="blockListLast">
 <li class="blockList">
 <h4>KeepAliveWorkerThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2056">KeepAliveWorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2093">KeepAliveWorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group)</pre>
 </li>
 </ul>
 </li>
@@ -269,7 +269,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExec
 <ul class="blockListLast">
 <li class="blockList">
 <h4>keepAlive</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2061">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2098">keepAlive</a>(long&nbsp;lastUpdate)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#keepAlive-long-">keepAlive</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.WorkerThread</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
index df84dbb..597d3d5 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.148">ProcedureExecutor.ProcedureExecutorListener</a></pre>
+<pre>public static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.152">ProcedureExecutor.ProcedureExecutorListener</a></pre>
 </li>
 </ul>
 </div>
@@ -157,7 +157,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureLoaded</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.149">procedureLoaded</a>(long&nbsp;procId)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.153">procedureLoaded</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="procedureAdded-long-">
@@ -166,7 +166,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureAdded</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.150">procedureAdded</a>(long&nbsp;procId)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.154">procedureAdded</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="procedureFinished-long-">
@@ -175,7 +175,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>procedureFinished</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.151">procedureFinished</a>(long&nbsp;procId)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html#line.155">procedureFinished</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
index 5e40a85..9575c52 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.96">ProcedureExecutor.Testing</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.100">ProcedureExecutor.Testing</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">Class with parameters describing how to fail/die when in testing-context.</div>
 </li>
@@ -239,7 +239,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killIfHasParent</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.97">killIfHasParent</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.101">killIfHasParent</a></pre>
 </li>
 </ul>
 <a name="killIfSuspended">
@@ -248,7 +248,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killIfSuspended</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.98">killIfSuspended</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.102">killIfSuspended</a></pre>
 </li>
 </ul>
 <a name="killBeforeStoreUpdate">
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killBeforeStoreUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.104">killBeforeStoreUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.108">killBeforeStoreUpdate</a></pre>
 <div class="block">Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is
  persisting all the state it needs to recover after a crash.</div>
 </li>
@@ -268,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>toggleKillBeforeStoreUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.105">toggleKillBeforeStoreUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.109">toggleKillBeforeStoreUpdate</a></pre>
 </li>
 </ul>
 <a name="killAfterStoreUpdate">
@@ -277,7 +277,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>killAfterStoreUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.112">killAfterStoreUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.116">killAfterStoreUpdate</a></pre>
 <div class="block">Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978
  is about a case where memory-state was being set after store to WAL where a crash could
  cause us to get stuck. This flag allows killing at what was a vulnerable time.</div>
@@ -289,7 +289,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toggleKillAfterStoreUpdate</h4>
-<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.113">toggleKillAfterStoreUpdate</a></pre>
+<pre>protected&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.117">toggleKillAfterStoreUpdate</a></pre>
 </li>
 </ul>
 </li>
@@ -306,7 +306,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Testing</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.96">Testing</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.100">Testing</a>()</pre>
 </li>
 </ul>
 </li>
@@ -323,7 +323,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldKillBeforeStoreUpdate</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.115">shouldKillBeforeStoreUpdate</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.119">shouldKillBeforeStoreUpdate</a>()</pre>
 </li>
 </ul>
 <a name="shouldKillBeforeStoreUpdate-boolean-boolean-">
@@ -332,7 +332,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldKillBeforeStoreUpdate</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.124">shouldKillBeforeStoreUpdate</a>(boolean&nbsp;isSuspended,
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.128">shouldKillBeforeStoreUpdate</a>(boolean&nbsp;isSuspended,
                                               boolean&nbsp;hasParent)</pre>
 </li>
 </ul>
@@ -342,7 +342,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldKillAfterStoreUpdate</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.134">shouldKillAfterStoreUpdate</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.138">shouldKillAfterStoreUpdate</a>()</pre>
 </li>
 </ul>
 <a name="shouldKillAfterStoreUpdate-boolean-">
@@ -351,7 +351,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>shouldKillAfterStoreUpdate</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.143">shouldKillAfterStoreUpdate</a>(boolean&nbsp;isSuspended)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html#line.147">shouldKillAfterStoreUpdate</a>(boolean&nbsp;isSuspended)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
index 193a80d..af82d80 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2074">ProcedureExecutor.WorkerMonitor</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2111">ProcedureExecutor.WorkerMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.html" title="class in org.apache.hadoop.hbase.procedure2">InlineChore</a></pre>
 </li>
 </ul>
@@ -277,7 +277,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>WORKER_MONITOR_INTERVAL_CONF_KEY</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/ProcedureExecutor.WorkerMonitor.html#line.2075">WORKER_MONITOR_INTERVAL_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2112">WORKER_MONITOR_INTERVAL_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.WORKER_MONITOR_INTERVAL_CONF_KEY">Constant Field Values</a></dd>
@@ -290,7 +290,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WORKER_MONITOR_INTERVAL</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2077">DEFAULT_WORKER_MONITOR_INTERVAL</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2114">DEFAULT_WORKER_MONITOR_INTERVAL</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.DEFAULT_WORKER_MONITOR_INTERVAL">Constant Field Values</a></dd>
@@ -303,7 +303,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>WORKER_STUCK_THRESHOLD_CONF_KEY</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/ProcedureExecutor.WorkerMonitor.html#line.2079">WORKER_STUCK_THRESHOLD_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2116">WORKER_STUCK_THRESHOLD_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.WORKER_STUCK_THRESHOLD_CONF_KEY">Constant Field Values</a></dd>
@@ -316,7 +316,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WORKER_STUCK_THRESHOLD</h4>
-<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2081">DEFAULT_WORKER_STUCK_THRESHOLD</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2118">DEFAULT_WORKER_STUCK_THRESHOLD</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.DEFAULT_WORKER_STUCK_THRESHOLD">Constant Field Values</a></dd>
@@ -329,7 +329,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>WORKER_ADD_STUCK_PERCENTAGE_CONF_KEY</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/ProcedureExecutor.WorkerMonitor.html#line.2083">WORKER_ADD_STUCK_PERCENTAGE_CONF_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2120">WORKER_ADD_STUCK_PERCENTAGE_CONF_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.WORKER_ADD_STUCK_PERCENTAGE_CONF_KEY">Constant Field Values</a></dd>
@@ -342,7 +342,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_WORKER_ADD_STUCK_PERCENTAGE</h4>
-<pre>private static final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2085">DEFAULT_WORKER_ADD_STUCK_PERCENTAGE</a></pre>
+<pre>private static final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2122">DEFAULT_WORKER_ADD_STUCK_PERCENTAGE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.procedure2.ProcedureExecutor.WorkerMonitor.DEFAULT_WORKER_ADD_STUCK_PERCENTAGE">Constant Field Values</a></dd>
@@ -355,7 +355,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>addWorkerStuckPercentage</h4>
-<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2087">addWorkerStuckPercentage</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2124">addWorkerStuckPercentage</a></pre>
 </li>
 </ul>
 <a name="timeoutInterval">
@@ -364,7 +364,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>timeoutInterval</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2088">timeoutInterval</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2125">timeoutInterval</a></pre>
 </li>
 </ul>
 <a name="stuckThreshold">
@@ -373,7 +373,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stuckThreshold</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2089">stuckThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2126">stuckThreshold</a></pre>
 </li>
 </ul>
 </li>
@@ -390,7 +390,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WorkerMonitor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2091">WorkerMonitor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2128">WorkerMonitor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -407,7 +407,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2096">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2133">run</a>()</pre>
 </li>
 </ul>
 <a name="checkForStuckWorkers--">
@@ -416,7 +416,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>checkForStuckWorkers</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2104">checkForStuckWorkers</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2141">checkForStuckWorkers</a>()</pre>
 </li>
 </ul>
 <a name="checkThreadCount-int-">
@@ -425,7 +425,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>checkThreadCount</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2120">checkThreadCount</a>(int&nbsp;stuckCount)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2157">checkThreadCount</a>(int&nbsp;stuckCount)</pre>
 </li>
 </ul>
 <a name="refreshConfig--">
@@ -434,7 +434,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshConfig</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2139">refreshConfig</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2176">refreshConfig</a>()</pre>
 </li>
 </ul>
 <a name="getTimeoutInterval--">
@@ -443,7 +443,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.h
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getTimeoutInterval</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2149">getTimeoutInterval</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2186">getTimeoutInterval</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.html#getTimeoutInterval--">getTimeoutInterval</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/InlineChore.html" title="class in org.apache.hadoop.hbase.procedure2">InlineChore</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
index fdca522..d147e4b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html
@@ -131,7 +131,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1974">ProcedureExecutor.WorkerThread</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2012">ProcedureExecutor.WorkerThread</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThread.html" title="class in org.apache.hadoop.hbase.procedure2">StoppableThread</a></pre>
 </li>
 </ul>
@@ -282,7 +282,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>executionStartTime</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1975">executionStartTime</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLong.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicLong</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2013">executionStartTime</a></pre>
 </li>
 </ul>
 <a name="activeProcedure">
@@ -291,7 +291,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>activeProcedure</h4>
-<pre>private volatile&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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1976">activeProcedure</a></pre>
+<pre>private volatile&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/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2014">activeProcedure</a></pre>
 </li>
 </ul>
 </li>
@@ -308,7 +308,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>WorkerThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1978">WorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2016">WorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group)</pre>
 </li>
 </ul>
 <a name="WorkerThread-java.lang.ThreadGroup-java.lang.String-">
@@ -317,7 +317,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WorkerThread</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1982">WorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2020">WorkerThread</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/ThreadGroup.html?is-external=true" title="class or interface in java.lang">ThreadGroup</a>&nbsp;group,
                        <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;prefix)</pre>
 </li>
 </ul>
@@ -335,7 +335,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>sendStopSignal</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1988">sendStopSignal</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2026">sendStopSignal</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThread.html#sendStopSignal--">sendStopSignal</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThread.html" title="class in org.apache.hadoop.hbase.procedure2">StoppableThread</a></code></dd>
@@ -348,7 +348,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.1993">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2030">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>
@@ -363,7 +363,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2034">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2071">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></code></dd>
@@ -376,7 +376,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentRunTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2042">getCurrentRunTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2079">getCurrentRunTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the time since the current procedure is running</dd>
@@ -389,7 +389,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/StoppableThre
 <ul class="blockListLast">
 <li class="blockList">
 <h4>keepAlive</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2047">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2084">keepAlive</a>(long&nbsp;lastUpdate)</pre>
 </li>
 </ul>
 </li>


[27/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446

<TRUNCATED>

[26/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.Testing.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        if (

<TRUNCATED>

[37/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
index 721035e..f808b16 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
@@ -169,3778 +169,3785 @@
 <span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.161"></a>
 <span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.quotas.MasterQuotasObserver;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.quotas.QuotaObserverChore;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.regionserver.RSRpcServices;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.replication.ReplicationLoadSource;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
-<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
-<span class="sourceLineNo">242</span> *<a name="line.242"></a>
-<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> *<a name="line.246"></a>
-<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
-<span class="sourceLineNo">248</span> *<a name="line.248"></a>
-<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
-<span class="sourceLineNo">250</span> */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
-<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<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>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.setDaemon(true);<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>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  //Tracker for master maintenance mode setting<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  private ClusterSchemaService clusterSchemaService;<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    "hbase.master.wait.on.service.seconds";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  // Metrics for the HMaster<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  final MetricsMaster metricsMaster;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // file system manager for the master FS operations<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private MasterFileSystem fileSystemManager;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterWalManager walManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // server manager to deal with region server info<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private volatile ServerManager serverManager;<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // manager of assignment nodes in zookeeper<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private AssignmentManager assignmentManager;<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  // manager of replication<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  // buffer for "fatal error" notices from region servers<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // in the cluster. This is only used for assisting<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // operations/debugging.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // flag set after we become the active master (used for testing)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private volatile boolean activeMaster = false;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  // flag set after we complete initialization once active<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  // flag set after master services are started,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // initialization may have not completed yet.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  volatile boolean serviceStarted = false;<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Maximum time we should run balancer for<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  private final int maxBlancingTime;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Maximum percent of regions in transition when balancing<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  private final double maxRitPercent;<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private final LockManager lockManager = new LockManager(this);<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private LoadBalancer balancer;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private RegionNormalizer normalizer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private BalancerChore balancerChore;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private RegionNormalizerChore normalizerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private ClusterStatusChore clusterStatusChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  CatalogJanitor catalogJanitorChore;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private LogCleaner logCleaner;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private HFileCleaner hfileCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private MobCompactionChore mobCompactChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // used to synchronize the mobCompactionStates<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // save the information of mob compactions in tables.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  MasterCoprocessorHost cpHost;<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  private final boolean preLoadTableDescriptors;<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // Time stamps for when a hmaster became active<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  private long masterActiveTime;<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  private long masterFinishedInitializationTime;<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private final boolean masterCheckCompression;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  //should we check encryption settings at master side, default true<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private final boolean masterCheckEncryption;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // monitor for snapshot of hbase tables<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  SnapshotManager snapshotManager;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // monitor for distributed procedures<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private MasterProcedureManagerHost mpmHost;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  private volatile MasterQuotaManager quotaManager;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private QuotaObserverChore quotaObserverChore;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private WALProcedureStore procedureStore;<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // handle table states<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private TableStateManager tableStateManager;<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private long splitPlanCount;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long mergePlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /* Handle favored nodes information */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  private FavoredNodesManager favoredNodesManager;<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private Server masterJettyServer;<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public static class RedirectServlet extends HttpServlet {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private final int regionServerInfoPort;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final String regionServerHostname;<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>     * @param infoServer that we're trying to send all requests to<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     */<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       regionServerInfoPort = infoServer.getPort();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerHostname = hostname;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    public void doGet(HttpServletRequest request,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      String redirectHost = regionServerHostname;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      if(redirectHost == null) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        redirectHost = request.getServerName();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "to an appropriate hostname.");<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          return;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      String redirectUrl = request.getScheme() + "://"<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + request.getRequestURI();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      response.sendRedirect(redirectUrl);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Initializes the HMaster. The steps are as follows:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * &lt;p&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;ol&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;/ol&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;p&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * Remaining steps of initialization occur in<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * the master becomes the active one.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public HMaster(final Configuration conf)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throws IOException, KeeperException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    super(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    TraceUtil.initTracer(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      // Disable usage of meta replicas in the master<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>      decorateMasterConfiguration(this.conf);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>      // should we check encryption settings at master side, default true<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // preload table descriptor at startup<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Do we publish the status?<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.538"></a>
-<span class="sourceLineNo">539</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.Publisher.class);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (shouldPublish) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        if (publisherClass == null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              " is not set - not publishing status");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        } else {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        }<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>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      } else {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        this.activeMasterManager = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    } catch (Throwable t) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // cause of failed startup is lost.<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      LOG.error("Failed construction of Master", t);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw t;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  @Override<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // block in here until then.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  @Override<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void run() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            int infoPort = putUpJettyServer();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            startActiveMasterManager(infoPort);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          } catch (Throwable t) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            // Make sure we log the exception.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            String error = "Failed to become Active Master";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            LOG.error(error, t);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            // Abort should have been called already.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            if (!isAborted()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              abort(error, t);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }), getName() + ":becomeActiveMaster");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // the super run call will do this for us.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      super.run();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    } finally {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      if (this.clusterSchemaService != null) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>        // If on way out, then we are no longer active master.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        this.clusterSchemaService.stopAsync();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          this.clusterSchemaService.awaitTerminated(<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (TimeoutException te) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      this.activeMaster = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  // return the actual infoPort, -1 means disable info server.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  private int putUpJettyServer() throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return -1;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // -1 is for disabling info server, so no redirecting<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return -1;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if(infoPort == infoServer.getPort()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      return infoPort;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      String msg =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.629"></a>
-<span class="sourceLineNo">630</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + "hbase.master.info.bindAddress";<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      LOG.error(msg);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      throw new IOException(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // a second entire stack here.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    masterJettyServer = new Server();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    connector.setHost(addr);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setPort(infoPort);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    masterJettyServer.addConnector(connector);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final String redirectHostname =<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.setServer(masterJettyServer);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    try {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      masterJettyServer.start();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } catch (Exception e) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return connector.getLocalPort();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  @Override<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      super.login(user, host);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    } catch (IOException ie) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      user.login("hbase.master.keytab.file",<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        "hbase.master.kerberos.principal", host);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * If configured to put regions on active master,<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * wait till a backup master becomes active.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Override<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  protected void waitForMasterActive(){<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      sleeper.sleep();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  @VisibleForTesting<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return (MasterRpcServices)rpcServices;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Override<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  protected String getProcessName() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return MASTER;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  protected boolean canCreateBaseZNode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return true;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  protected boolean canUpdateTableDescriptor() {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    return true;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  @Override<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    return new MasterRpcServices(this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void configureInfoServer() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    infoServer.addServlet("master-status", "/master-status", MasterStatusServlet.class);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    infoServer.setAttribute(MASTER, this);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    if (LoadBalancer.isTablesOnMaster(conf)) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      super.configureInfoServer();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return MasterDumpServlet.class;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public MetricsMaster getMasterMetrics() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return metricsMaster;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * &lt;p&gt;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * Initialize all ZK based system trackers. But do not include {@link RegionServerTracker}, it<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * should have already been initialized along with {@link ServerManager}.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * &lt;/p&gt;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * &lt;p&gt;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   * Will be overridden in tests.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>   * &lt;/p&gt;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   */<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  @VisibleForTesting<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  protected void initializeZKBasedSystemTrackers()<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      throws IOException, InterruptedException, KeeperException, ReplicationException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    this.balancer = LoadBalancerFactory.getLoadBalancer(conf);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    this.normalizer.setMasterServices(this);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    this.loadBalancerTracker = new LoadBalancerTracker(zooKeeper, this);<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    this.loadBalancerTracker.start();<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    this.regionNormalizerTracker = new RegionNormalizerTracker(zooKeeper, this);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    this.regionNormalizerTracker.start();<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    this.splitOrMergeTracker = new SplitOrMergeTracker(zooKeeper, conf, this);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    this.splitOrMergeTracker.start();<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    this.replicationPeerManager = ReplicationPeerManager.create(zooKeeper, conf);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    this.syncReplicationReplayWALManager = new SyncReplicationReplayWALManager(this);<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    this.drainingServerTracker = new DrainingServerTracker(zooKeeper, this, this.serverManager);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    this.drainingServerTracker.start();<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>    this.maintenanceModeTracker = new MasterMaintenanceModeTracker(zooKeeper);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    this.maintenanceModeTracker.start();<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    String clientQuorumServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    boolean clientZkObserverMode = conf.getBoolean(HConstants.CLIENT_ZOOKEEPER_OBSERVER_MODE,<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      HConstants.DEFAULT_CLIENT_ZOOKEEPER_OBSERVER_MODE);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (clientQuorumServers != null &amp;&amp; !clientZkObserverMode) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      // we need to take care of the ZK information synchronization<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      // if given client ZK are not observer nodes<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      ZKWatcher clientZkWatcher = new ZKWatcher(conf,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          getProcessName() + ":" + rpcServices.getSocketAddress().getPort() + "-clientZK", this,<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          false, true);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      this.metaLocationSyncer = new MetaLocationSyncer(zooKeeper, clientZkWatcher, this);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.metaLocationSyncer.start();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      this.masterAddressSyncer = new MasterAddressSyncer(zooKeeper, clientZkWatcher, this);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.masterAddressSyncer.start();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      // set cluster id is a one-go effort<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      ZKClusterId.setClusterId(clientZkWatcher, fileSystemManager.getClusterId());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Set the cluster as up.  If new RSs, they'll be waiting on this before<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // going ahead with their startup.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    boolean wasUp = this.clusterStatusTracker.isClusterUp();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    if (!wasUp) this.clusterStatusTracker.setClusterUp();<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    LOG.info("Active/primary master=" + this.serverName +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        ", sessionid=0x" +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()) +<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        ", setting cluster-up flag (Was=" + wasUp + ")");<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>    // create/initialize the snapshot manager and other procedure managers<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    this.snapshotManager = new SnapshotManager();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    this.mpmHost = new MasterProcedureManagerHost();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    this.mpmHost.register(this.snapshotManager);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    this.mpmHost.register(new MasterFlushTableProcedureManager());<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.mpmHost.loadProcedures(conf);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    this.mpmHost.initialize(this, this.metricsMaster);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  private static final ImmutableSet&lt;Class&lt;?&gt;&gt; UNSUPPORTED_PROCEDURES =<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ImmutableSet.of(RecoverMetaProcedure.class, AssignProcedure.class, UnassignProcedure.class,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      MoveRegionProcedure.class);<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * make sure that there are none these procedures when upgrading. If there are, the master will<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * quit, you need to go back to the old version to finish these procedures first before upgrading.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   */<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  private void checkUnsupportedProcedure(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType)<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throws HBaseIOException {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    // Confirm that we do not have unfinished assign/unassign related procedures. It is not easy to<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    // support both the old assign/unassign procedures and the new TransitRegionStateProcedure as<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    // there will be conflict in the code for AM. We should finish all these procedures before<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    // upgrading.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    for (Class&lt;?&gt; clazz : UNSUPPORTED_PROCEDURES) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt; procs = procsByType.get(clazz);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      if (procs != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        LOG.error(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          "Unsupported procedure type {} found, please rollback your master to the old" +<a name="line.831"></a>
-<span class="sourceLineNo">832</span>            " version to finish them, and then try to upgrade again. The full procedure list: {}",<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          clazz, procs);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        throw new HBaseIOException("Unsupported procedure type " + clazz + " found");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // A special check for SCP, as we do not support RecoverMetaProcedure any more so we need to<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    // make sure that no one will try to schedule it but SCP does have a state which will schedule<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    // it.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    if (procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      .map(p -&gt; (ServerCrashProcedure) p).anyMatch(ServerCrashProcedure::isInRecoverMetaState)) {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      LOG.error("At least one ServerCrashProcedure is going to schedule a RecoverMetaProcedure," +<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        " which is not supported any more. Please rollback your master to the old version to" +<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        " finish them, and then try to upgrade again.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      throw new HBaseIOException("Unsupported procedure state found for ServerCrashProcedure");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  // Will be overriden in test to inject customized AssignmentManager<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  @VisibleForTesting<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected AssignmentManager createAssignmentManager(MasterServices master) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return new AssignmentManager(master);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  /**<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * Finish initialization of HMaster after becoming the primary master.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * &lt;p/&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * The startup order is a bit complicated but very important, do not change it unless you know<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * what you are doing.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   * &lt;ol&gt;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>   * &lt;li&gt;Initialize file system based components - file system manager, wal manager, table<a name="line.861"></a>
-<span class="sourceLineNo">862</span>   * descriptors, etc&lt;/li&gt;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>   * &lt;li&gt;Publish cluster id&lt;/li&gt;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * &lt;li&gt;Here comes the most complicated part - initialize server manager, assignment manager and<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * region server tracker<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * &lt;ol type='i'&gt;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * &lt;li&gt;Create server manager&lt;/li&gt;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * &lt;li&gt;Create procedure executor, load the procedures, but do not start workers. We will start it<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * later after we finish scheduling SCPs to avoid scheduling duplicated SCPs for the same<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * server&lt;/li&gt;<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * &lt;li&gt;Create assignment manager and start it, load the meta region state, but do not load data<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * from meta region&lt;/li&gt;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * &lt;li&gt;Start region server tracker, construct the online servers set and find out dead servers and<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * schedule SCP for them. The online servers will be constructed by scanning zk, and we will also<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * scan the wal directory to find out possible live region servers, and the differences between<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * these two sets are the dead servers&lt;/li&gt;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;/ol&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * &lt;/li&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * &lt;li&gt;If this is a new deploy, schedule a InitMetaProcedure to initialize meta&lt;/li&gt;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * &lt;li&gt;Start necessary service threads - balancer, catalog janior, executor services, and also the<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * procedure executor, etc. Notice that the balancer must be created first as assignment manager<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * may use it when assigning regions.&lt;/li&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * &lt;li&gt;Wait for meta to be initialized if necesssary, start table state manager.&lt;/li&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * &lt;li&gt;Wait for enough region servers to check-in&lt;/li&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * &lt;li&gt;Let assignment manager load data from meta and construct region states&lt;/li&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * &lt;li&gt;Start all other things such as chore services, etc&lt;/li&gt;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   * &lt;/ol&gt;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>   * &lt;p/&gt;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Notice that now we will not schedule a special procedure to make meta online(unless the first<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * time where meta has not been created yet), we will rely on SCP to bring meta online.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  private void finishActiveMasterInitialization(MonitoredTask status) throws IOException,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          InterruptedException, KeeperException, ReplicationException {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    Thread zombieDetector = new Thread(new InitializationMonitor(this),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        "ActiveMasterInitializationMonitor-" + System.currentTimeMillis());<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    zombieDetector.setDaemon(true);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    zombieDetector.start();<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>    /*<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * We are active master now... go initialize components we need to run.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    status.setStatus("Initializing Master file system");<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>    this.masterActiveTime = System.currentTimeMillis();<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // TODO: Do this using Dependency Injection, using PicoContainer, Guice or Spring.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    // Initialize the chunkCreator<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    initializeMemStoreChunkCreator();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    this.fileSystemManager = new MasterFileSystem(conf);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    this.walManager = new MasterWalManager(this);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // enable table descriptors cache<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    this.tableDescriptors.setCacheOn();<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // warm-up HTDs cache on master initialization<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    if (preLoadTableDescriptors) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      status.setStatus("Pre-loading table descriptors");<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      this.tableDescriptors.getAll();<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Publish cluster ID; set it in Master too. The superclass RegionServer does this later but<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    // only after it has checked in with the Master. At least a few tests ask Master for clusterId<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // before it has called its run method and before RegionServer has done the reportForDuty.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    ClusterId clusterId = fileSystemManager.getClusterId();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    status.setStatus("Publishing Cluster ID " + clusterId + " in ZooKeeper");<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    ZKClusterId.setClusterId(this.zooKeeper, fileSystemManager.getClusterId());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    this.clusterId = clusterId.toString();<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // Precaution. Put in place the old hbck1 lock file to fence out old hbase1s running their<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // hbck1s against an hbase2 cluster; it could do damage. To skip this behavior, set<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // hbase.write.hbck1.lock.file to false.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (this.conf.getBoolean("hbase.write.hbck1.lock.file", true)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      HBaseFsck.checkAndMarkRunningHbck(this.conf,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          HBaseFsck.createLockRetryCounterFactory(this.conf).create());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    status.setStatus("Initialize ServerManager and schedule SCP for crash servers");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    this.serverManager = createServerManager(this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    createProcedureExecutor();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    @SuppressWarnings("rawtypes")<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType =<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      procedureExecutor.getActiveProceduresNoCopy().stream()<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        .collect(Collectors.groupingBy(p -&gt; p.getClass()));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>    checkUnsupportedProcedure(procsByType);<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    // Create Assignment Manager<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    this.assignmentManager = createAssignmentManager(this);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    this.assignmentManager.start();<a name="line.948"></a>
-<span class="sourceLineNo">949</span>    // TODO: TRSP can perform as the sub procedure for other procedures, so even if it is marked as<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    // completed, it could still be in the procedure list. This is a bit strange but is another<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    // story, need to verify the implementation for ProcedureExecutor and ProcedureStore.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    List&lt;TransitRegionStateProcedure&gt; ritList =<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      procsByType.getOrDefault(TransitRegionStateProcedure.class, Collections.emptyList()).stream()<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        .filter(p -&gt; !p.isFinished()).map(p -&gt; (TransitRegionStateProcedure) p)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        .collect(Collectors.toList());<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    this.assignmentManager.setupRIT(ritList);<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // Start RegionServerTracker with listing of servers found with exiting SCPs -- these should<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // be registered in the deadServers set -- and with the list of servernames out on the<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    // filesystem that COULD BE 'alive' (we'll schedule SCPs for each and let SCP figure it out).<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    // We also pass dirs that are already 'splitting'... so we can do some checks down in tracker.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // TODO: Generate the splitting and live Set in one pass instead of two as we currently do.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    this.regionServerTracker = new RegionServerTracker(zooKeeper, this, this.serverManager);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    this.regionServerTracker.start(<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        .map(p -&gt; (ServerCrashProcedure) p).map(p -&gt; p.getServerName()).collect(Collectors.toSet()),<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      walManager.getLiveServersFromWALDir(), walManager.getSplittingServersFromWALDir());<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    // This manager will be started AFTER hbase:meta is confirmed on line.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    // hbase.mirror.table.state.to.zookeeper is so hbase1 clients can connect. They read table<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    // state from zookeeper while hbase2 reads it from hbase:meta. Disable if no hbase1 clients.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    this.tableStateManager =<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY, true)<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        ?<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        new MirroringTableStateManager(this):<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        new TableStateManager(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    status.setStatus("Initializing ZK system trackers");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    initializeZKBasedSystemTrackers();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    status.setStatus("Loading last flushed sequence id of regions");<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    try {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    } catch (IOException e) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          + " from file system", e);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    this.activeMaster = true;<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>    // This is for backwards compatibility<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // See HBASE-11393<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    status.setStatus("Update TableCFs node in ZNode");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    ReplicationPeerConfigUpgrader tableCFsUpdater =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        new ReplicationPeerConfigUpgrader(zooKee

<TRUNCATED>

[04/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 22567b5..252581d 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index 2fee6c0..34eaf86 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 0938acd..c44190a 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 45acdd2..ce46430 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index a745e35..a229b91 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index f87797f..290350a 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 6016ce6..a614e2a 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 4009702..8b8413e 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 7068006..228b2c7 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index b1dd6f9..a7ace81 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index a54cecb..d220bdc 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 3264529..19a6004 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index 80401a1..8127776 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 15566fe..f9dda43 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index d3cd1fe..5115a9b 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 53aaa93..b9a49de 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 669a46c..9d4ee4e 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -760,7 +760,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 976baa7..3028488 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1108,6 +1108,10 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot" target="classFrame">TestFlushSnapshotFromClient</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle" target="classFrame">TestFlushWithThroughputController</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/TestForceCacheImportantBlocks.html" title="class in org.apache.hadoop.hbase.io.hfile" target="classFrame">TestForceCacheImportantBlocks</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal" target="classFrame">TestForceUpdateProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal" target="classFrame">TestForceUpdateProcedure.ExchangeProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal" target="classFrame">TestForceUpdateProcedure.ParentProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal" target="classFrame">TestForceUpdateProcedure.WaitingProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling" target="classFrame">TestForeignExceptionDispatcher</a></li>
 <li><a href="org/apache/hadoop/hbase/errorhandling/TestForeignExceptionSerialization.html" title="class in org.apache.hadoop.hbase.errorhandling" target="classFrame">TestForeignExceptionSerialization</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestFromClientSide.html" title="class in org.apache.hadoop.hbase.client" target="classFrame">TestFromClientSide</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 7cab8cc..0f24312 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1108,6 +1108,10 @@
 <li><a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestFlushSnapshotFromClient</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/throttle/TestFlushWithThroughputController.html" title="class in org.apache.hadoop.hbase.regionserver.throttle">TestFlushWithThroughputController</a></li>
 <li><a href="org/apache/hadoop/hbase/io/hfile/TestForceCacheImportantBlocks.html" title="class in org.apache.hadoop.hbase.io.hfile">TestForceCacheImportantBlocks</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></li>
+<li><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></li>
 <li><a href="org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling">TestForeignExceptionDispatcher</a></li>
 <li><a href="org/apache/hadoop/hbase/errorhandling/TestForeignExceptionSerialization.html" title="class in org.apache.hadoop.hbase.errorhandling">TestForeignExceptionSerialization</a></li>
 <li><a href="org/apache/hadoop/hbase/client/TestFromClientSide.html" title="class in org.apache.hadoop.hbase.client">TestFromClientSide</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index b4c3326..63ba7f4 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -13736,6 +13736,13 @@
 </tr>
 <tbody>
 <tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedList.Generator.BIG_FAMILY_VALUE_SIZE_KEY">
+<!--   -->
+</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/test/IntegrationTestBigLinkedList.Generator.html#BIG_FAMILY_VALUE_SIZE_KEY">BIG_FAMILY_VALUE_SIZE_KEY</a></code></td>
+<td class="colLast"><code>"generator.big.family.value.size"</code></td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedList.Generator.MULTIPLE_UNEVEN_COLUMNFAMILIES_KEY">
 <!--   -->
 </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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 21310c6..10407bb 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -130,6 +130,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html#abort-TEnv-">abort(TEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#abort-java.lang.Void-">abort(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#abort-java.lang.Void-">abort(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#abort-java.lang.Void-">abort(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#abort-java.lang.Void-">abort(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore.TestSequentialProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html#abort-org.apache.hadoop.hbase.procedure2.TestChildProcedures.TestProcEnv-">abort(TestChildProcedures.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestChildProcedures.TestChildProcedure</a></dt>
@@ -2613,6 +2619,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html#BIG_FAMILY_NAME">BIG_FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.html#BIG_FAMILY_VALUE_SIZE_KEY">BIG_FAMILY_VALUE_SIZE_KEY</a></span> - Static variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator</a></dt>
+<dd>
+<div class="block">Set this configuration if you want to scale up the size of test data quickly.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.html#BIG_LONG">BIG_LONG</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestMultiColumnScanner</a></dt>
 <dd>
 <div class="block">A large value of type long for use as a timestamp</div>
@@ -2883,8 +2893,6 @@
 <dd>
 <div class="block">expected location of the test.build.webapps dir: "src/main/resources/hbase-webapps"</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#buildBitSetNode-long:A-long:A-long:A-">buildBitSetNode(long[], long[], long[])</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/tool/TestLoadIncrementalHFilesSplitRecovery.html#buildBulkFiles-org.apache.hadoop.hbase.TableName-int-">buildBulkFiles(TableName, int)</a></span> - Method in class org.apache.hadoop.hbase.tool.<a href="org/apache/hadoop/hbase/tool/TestLoadIncrementalHFilesSplitRecovery.html" title="class in org.apache.hadoop.hbase.tool">TestLoadIncrementalHFilesSplitRecovery</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/TestProcedureMember.html#buildCohortMember--">buildCohortMember()</a></span> - Method in class org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/TestProcedureMember.html" title="class in org.apache.hadoop.hbase.procedure">TestProcedureMember</a></dt>
@@ -3000,8 +3008,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TimedOutTestsListener.html#buildThreadDump--">buildThreadDump()</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TimedOutTestsListener.html" title="class in org.apache.hadoop.hbase">TimedOutTestsListener</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#buildTracker-long:A-long:A-long:A-">buildTracker(long[], long[], long[])</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.html#bulkHLogShouldThrowErrorWhenFamilySpecifiedAndHFileExistsButNotInTableDescriptor--">bulkHLogShouldThrowErrorWhenFamilySpecifiedAndHFileExistsButNotInTableDescriptor()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.html" title="class in org.apache.hadoop.hbase.regionserver">TestBulkLoad</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.html#bulkHLogShouldThrowNoErrorAndWriteMarkerWithBlankInput--">bulkHLogShouldThrowNoErrorAndWriteMarkerWithBlankInput()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestBulkLoad.html" title="class in org.apache.hadoop.hbase.regionserver">TestBulkLoad</a></dt>
@@ -5435,6 +5441,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestStressWALProcedureStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#CLASS_RULE">CLASS_RULE</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore</a></dt>
@@ -10350,6 +10358,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.html#createStore-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.Path-">createStore(Configuration, Path)</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#createStoreAndExecutor--">createStoreAndExecutor()</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html#createStoreFile-org.apache.hadoop.hbase.regionserver.HRegion-">createStoreFile(HRegion)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompaction</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html#createStoreFile-org.apache.hadoop.hbase.regionserver.HRegion-java.lang.String-">createStoreFile(HRegion, String)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompaction</a></dt>
@@ -12047,6 +12057,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.TestProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore.TestSequentialProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a></dt>
@@ -13354,6 +13370,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestMetaCache.FakeRSRpcServices.html#exceptions">exceptions</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestMetaCache.FakeRSRpcServices.html" title="class in org.apache.hadoop.hbase.client">TestMetaCache.FakeRSRpcServices</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#ExchangeProcedure--">ExchangeProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#EXCHANGER">EXCHANGER</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestSwitchToStreamRead.MatchLastRowFilterRowFilter.html#exclude">exclude</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestSwitchToStreamRead.MatchLastRowFilterRowFilter.html" title="class in org.apache.hadoop.hbase.regionserver">TestSwitchToStreamRead.MatchLastRowFilterRowFilter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseClusterManager.html#exec-java.lang.String-org.apache.hadoop.hbase.ClusterManager.ServiceType-java.lang.String...-">exec(String, ClusterManager.ServiceType, String...)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseClusterManager.html" title="class in org.apache.hadoop.hbase">HBaseClusterManager</a></dt>
@@ -13362,6 +13382,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseClusterManager.html#exec-java.lang.String-org.apache.hadoop.hbase.ClusterManager.ServiceType-org.apache.hadoop.hbase.HBaseClusterManager.CommandProvider.Operation-">exec(String, ClusterManager.ServiceType, HBaseClusterManager.CommandProvider.Operation)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseClusterManager.html" title="class in org.apache.hadoop.hbase">HBaseClusterManager</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#EXEC">EXEC</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.html#exec">exec</a></span> - Static variable in class org.apache.hadoop.hbase.util.hbck.<a href="org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.html" title="class in org.apache.hadoop.hbase.util.hbck">HbckTestingUtil</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.GoodRsExecutor.html#execCloseRegion-org.apache.hadoop.hbase.ServerName-byte:A-">execCloseRegion(ServerName, byte[])</a></span> - Method in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentManagerBase.GoodRsExecutor.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentManagerBase.GoodRsExecutor</a></dt>
@@ -13442,6 +13464,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html#execute-TEnv-">execute(TEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#execute-java.lang.Void-">execute(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore.TestSequentialProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html#execute-org.apache.hadoop.hbase.procedure2.TestChildProcedures.TestProcEnv-">execute(TestChildProcedures.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestChildProcedures.TestChildProcedure</a></dt>
@@ -21054,8 +21082,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.html#initialized">initialized</a></span> - Static variable in class org.apache.hadoop.hbase.rsgroup.<a href="org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.html" title="class in org.apache.hadoop.hbase.rsgroup">IntegrationTestRSGroup</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.html#initialized">initialized</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html#initialized">initialized</a></span> - Variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/IOTestProvider.IOTestWAL.html" title="class in org.apache.hadoop.hbase.wal">IOTestProvider.IOTestWAL</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatRegionScanner.html#initializeKVHeap-java.util.List-java.util.List-org.apache.hadoop.hbase.regionserver.HRegion-">initializeKVHeap(List&lt;KeyValueScanner&gt;, List&lt;KeyValueScanner&gt;, HRegion)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.HeartbeatRegionScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerHeartbeatMessages.HeartbeatRegionScanner</a></dt>
@@ -21961,10 +21987,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/StartMiniClusterOption.html#isCreateWALDir--">isCreateWALDir()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#isDeleted-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-long-">isDeleted(ProcedureStoreTracker, long)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
-<dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#isDeleted-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">isDeleted(BitSetNode, long)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestInterfaceAlign.html#isDeprecated-java.lang.reflect.Method-">isDeprecated(Method)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestInterfaceAlign.html" title="class in org.apache.hadoop.hbase.client">TestInterfaceAlign</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/monkies/CalmChaosMonkey.html#isDestructive--">isDestructive()</a></span> - Method in class org.apache.hadoop.hbase.chaos.monkies.<a href="org/apache/hadoop/hbase/chaos/monkies/CalmChaosMonkey.html" title="class in org.apache.hadoop.hbase.chaos.monkies">CalmChaosMonkey</a></dt>
@@ -29362,6 +29384,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/MetricsAssertHelperImpl.MockRecordBuilder.html#parent--">parent()</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/MetricsAssertHelperImpl.MockRecordBuilder.html" title="class in org.apache.hadoop.hbase.test">MetricsAssertHelperImpl.MockRecordBuilder</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#ParentProcedure--">ParentProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/trace/TraceTree.SpansByParent.html#parentToSpans">parentToSpans</a></span> - Variable in class org.apache.hadoop.hbase.trace.<a href="org/apache/hadoop/hbase/trace/TraceTree.SpansByParent.html" title="class in org.apache.hadoop.hbase.trace">TraceTree.SpansByParent</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html#parentWithSpecifiedEndKeyCleanedEvenIfDaughterGoneFirst-java.lang.String-byte:A-">parentWithSpecifiedEndKeyCleanedEvenIfDaughterGoneFirst(String, byte[])</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestCatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">TestCatalogJanitor</a></dt>
@@ -34082,6 +34106,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html#rollback-TEnv-">rollback(TEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.NoopProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.NoopProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#rollback-java.lang.Void-">rollback(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#rollback-java.lang.Void-">rollback(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#rollback-java.lang.Void-">rollback(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#rollback-java.lang.Void-">rollback(Void)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore.TestSequentialProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html#rollback-org.apache.hadoop.hbase.procedure2.TestChildProcedures.TestProcEnv-">rollback(TestChildProcedures.TestProcEnv)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestChildProcedures.TestChildProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestChildProcedures.TestChildProcedure</a></dt>
@@ -36189,6 +36219,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureTestingUtility.TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureTestingUtility.TestProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ExchangeProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.ParentProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.TestSequentialProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore.TestSequentialProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData(ProcedureStateSerializer)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureEvents.TestTimeoutEventProcedure.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureEvents.TestTimeoutEventProcedure</a></dt>
@@ -37373,6 +37409,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/TestProcedure.html#setup--">setup()</a></span> - Method in class org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/TestProcedure.html" title="class in org.apache.hadoop.hbase.procedure">TestProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#setUp--">setUp()</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestStressWALProcedureStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#setUp--">setUp()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore</a></dt>
@@ -40864,6 +40902,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestSplitLogWorker.html#stopSplitLogWorker-org.apache.hadoop.hbase.regionserver.SplitLogWorker-">stopSplitLogWorker(SplitLogWorker)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestSplitLogWorker.html" title="class in org.apache.hadoop.hbase.regionserver">TestSplitLogWorker</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#stopStoreAndExecutor--">stopStoreAndExecutor()</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html#stopTestThread--">stopTestThread()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestThread</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/TestBackupManager.html#stopTimes">stopTimes</a></span> - Variable in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/TestBackupManager.html" title="class in org.apache.hadoop.hbase.backup">TestBackupManager</a></dt>
@@ -40889,6 +40929,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html#store">store</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#STORE">STORE</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestNamespaceQuotaViolationStore.html#store">store</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestNamespaceQuotaViolationStore.html" title="class in org.apache.hadoop.hbase.quotas">TestNamespaceQuotaViolationStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/quotas/TestTableQuotaViolationStore.html#store">store</a></span> - Variable in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestTableQuotaViolationStore.html" title="class in org.apache.hadoop.hbase.quotas">TestTableQuotaViolationStore</a></dt>
@@ -42719,6 +42761,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/TestFailedProcCleanup.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/TestFailedProcCleanup.html" title="class in org.apache.hadoop.hbase.procedure">TestFailedProcCleanup</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#tearDown--">tearDown()</a></span> - Static method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestStressWALProcedureStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html#tearDown--">tearDown()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestWALProcedureStore</a></dt>
@@ -43711,6 +43755,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/TestProcedureDescriber.html#test--">test()</a></span> - Method in class org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/TestProcedureDescriber.html" title="class in org.apache.hadoop.hbase.procedure">TestProcedureDescriber</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#test--">test()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.html#test--">test()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureSkipPersistence.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureSkipPersistence</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/compactions/TestDateTieredCompactor.html#test--">test()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.compactions.<a href="org/apache/hadoop/hbase/regionserver/compactions/TestDateTieredCompactor.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">TestDateTieredCompactor</a></dt>
@@ -49205,8 +49251,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/TestTableScan.html#testCustomFilter--">testCustomFilter()</a></span> - Method in class org.apache.hadoop.hbase.rest.<a href="org/apache/hadoop/hbase/rest/TestTableScan.html" title="class in org.apache.hadoop.hbase.rest">TestTableScan</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomMetaProvider--">testCustomMetaProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestDefaultStoreEngine.html#testCustomParts--">testCustomParts()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestDefaultStoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">TestDefaultStoreEngine</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.html#testCustomPolicy--">testCustomPolicy()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionSplitPolicy</a></dt>
@@ -49215,8 +49259,6 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html#testCustomProvider--">testCustomProvider()</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.<a href="org/apache/hadoop/hbase/io/crypto/TestCipherProvider.html" title="class in org.apache.hadoop.hbase.io.crypto">TestCipherProvider</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALFactory.html#testCustomProvider--">testCustomProvider()</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALFactory.html" title="class in org.apache.hadoop.hbase.wal">TestWALFactory</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html#testCustomReplicationEndpoint--">testCustomReplicationEndpoint()</a></span> - Method in class org.apache.hadoop.hbase.replication.<a href="org/apache/hadoop/hbase/replication/TestReplicationEndpoint.html" title="class in org.apache.hadoop.hbase.replication">TestReplicationEndpoint</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/wal/TestCustomWALCellCodec.html" title="class in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">TestCustomWALCellCodec</span></a> - Class in <a href="org/apache/hadoop/hbase/regionserver/wal/package-summary.html">org.apache.hadoop.hbase.regionserver.wal</a></dt>
@@ -51271,6 +51313,16 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestChoreService.html#testForceTrigger--">testForceTrigger()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestChoreService.html" title="class in org.apache.hadoop.hbase">TestChoreService</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">TestForceUpdateProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/store/wal/package-summary.html">org.apache.hadoop.hbase.procedure2.store.wal</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#TestForceUpdateProcedure--">TestForceUpdateProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">TestForceUpdateProcedure.ExchangeProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/store/wal/package-summary.html">org.apache.hadoop.hbase.procedure2.store.wal</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">TestForceUpdateProcedure.ParentProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/store/wal/package-summary.html">org.apache.hadoop.hbase.procedure2.store.wal</a></dt>
+<dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">TestForceUpdateProcedure.WaitingProcedure</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure2/store/wal/package-summary.html">org.apache.hadoop.hbase.procedure2.store.wal</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html#testForCheckingIfEnableAndDisableWorksFineAfterSwitch--">testForCheckingIfEnableAndDisableWorksFineAfterSwitch()</a></span> - Method in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterRestartAfterDisablingTable.html" title="class in org.apache.hadoop.hbase.master">TestMasterRestartAfterDisablingTable</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/errorhandling/TestForeignExceptionDispatcher.html" title="class in org.apache.hadoop.hbase.errorhandling"><span class="typeNameLink">TestForeignExceptionDispatcher</span></a> - Class in <a href="org/apache/hadoop/hbase/errorhandling/package-summary.html">org.apache.hadoop.hbase.errorhandling</a></dt>
@@ -51675,6 +51727,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestFromClientSide.html#testGet_NullQualifier--">testGet_NullQualifier()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestFromClientSide.html" title="class in org.apache.hadoop.hbase.client">TestFromClientSide</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testGetActiveProcIds--">testGetActiveProcIds()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestCIBadHostname.html#testGetAdminBadHostname--">testGetAdminBadHostname()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestCIBadHostname.html" title="class in org.apache.hadoop.hbase.client">TestCIBadHostname</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html#testGetAfterCompaction--">testGetAfterCompaction()</a></span> - Method in class org.apache.hadoop.hbase.mob.compactions.<a href="org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.html" title="class in org.apache.hadoop.hbase.mob.compactions">TestMobCompactor</a></dt>
@@ -62058,7 +62112,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/zookeeper/TestZKUtil.html#testSetDataWithVersion--">testSetDataWithVersion()</a></span> - Method in class org.apache.hadoop.hbase.zookeeper.<a href="org/apache/hadoop/hbase/zookeeper/TestZKUtil.html" title="class in org.apache.hadoop.hbase.zookeeper">TestZKUtil</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testSetDeletedIfSet--">testSetDeletedIfSet()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testSetDeletedIfModified--">testSetDeletedIfModified()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">TestProcedureStoreTracker</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/TestProcedureNonce.html#testSetFailureResultForNonce--">testSetFailureResultForNonce()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/TestProcedureNonce.html" title="class in org.apache.hadoop.hbase.procedure2">TestProcedureNonce</a></dt>
 <dd>&nbsp;</dd>
@@ -67680,6 +67734,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">ProcedureWALPerformanceEvaluation</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCleanupCompactedFileOnRegionClose.html#util">util</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCleanupCompactedFileOnRegionClose.html" title="class in org.apache.hadoop.hbase.regionserver">TestCleanupCompactedFileOnRegionClose</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html#UTIL">UTIL</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompaction.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompaction</a></dt>
@@ -69669,6 +69725,8 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompactionArchiveConcurrentClose.WaitingHRegionFileSystem.html#WaitingHRegionFileSystem-org.apache.hadoop.conf.Configuration-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.client.RegionInfo-">WaitingHRegionFileSystem(Configuration, FileSystem, Path, RegionInfo)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompactionArchiveConcurrentClose.WaitingHRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompactionArchiveConcurrentClose.WaitingHRegionFileSystem</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html#WaitingProcedure--">WaitingProcedure()</a></span> - Constructor for class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure.WaitingProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HBaseTestingUtility.html#waitLabelAvailable-long-java.lang.String...-">waitLabelAvailable(long, String...)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a></dt>
 <dd>
 <div class="block">Wait until labels is ready in VisibilityLabelsCache.</div>
@@ -69848,6 +69906,8 @@ the order they are declared.</div>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.Appender.html#wal">wal</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.Appender.html" title="class in org.apache.hadoop.hbase.regionserver.wal">TestLogRollingNoCluster.Appender</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#WAL_COUNT">WAL_COUNT</a></span> - Static variable in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.html#WAL_ENCRYPTION">WAL_ENCRYPTION</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.html" title="class in org.apache.hadoop.hbase.wal">TestWALReaderOnSecureWAL</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html#WAL_FILE_NAME">WAL_FILE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.replication.regionserver.<a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html" title="class in org.apache.hadoop.hbase.replication.regionserver">TestSerialReplicationChecker</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 6af42fe..2d9b60f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -146,8 +146,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestBackupDeleteWithFailures.Failure.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestBackupDeleteWithFailures.Failure</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/TestIncrementalBackupMergeWithFailures.FailurePhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">TestIncrementalBackupMergeWithFailures.FailurePhase</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html b/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html
index f179dc5..3f260a3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.320">Action.ActionContext</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.html#line.319">Action.ActionContext</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">Context for Action's</div>
 </li>
@@ -214,7 +214,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>util</h4>
-<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.321">util</a></pre>
+<pre>private&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.320">util</a></pre>
 </li>
 </ul>
 </li>
@@ -231,7 +231,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ActionContext</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.323">ActionContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a>&nbsp;util)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.322">ActionContext</a>(<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a>&nbsp;util)</pre>
 </li>
 </ul>
 </li>
@@ -248,7 +248,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getHBaseIntegrationTestingUtility</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.327">getHBaseIntegrationTestingUtility</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/IntegrationTestingUtility.html" title="class in org.apache.hadoop.hbase">IntegrationTestingUtility</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.326">getHBaseIntegrationTestingUtility</a>()</pre>
 </li>
 </ul>
 <a name="getHBaseCluster--">
@@ -257,7 +257,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.331">getHBaseCluster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.330">getHBaseCluster</a>()</pre>
 </li>
 </ul>
 <a name="isStopping--">
@@ -266,7 +266,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>isStopping</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.335">isStopping</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/chaos/actions/Action.ActionContext.html#line.334">isStopping</a>()</pre>
 </li>
 </ul>
 </li>


[20/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
index ff29160..e4dc134 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html
@@ -42,190 +42,208 @@
 <span class="sourceLineNo">034</span>public interface ProcedureStore {<a name="line.34"></a>
 <span class="sourceLineNo">035</span>  /**<a name="line.35"></a>
 <span class="sourceLineNo">036</span>   * Store listener interface.<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   * The main process should register a listener and respond to the store events.<a name="line.37"></a>
-<span class="sourceLineNo">038</span>   */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public interface ProcedureStoreListener {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>     * triggered when the store sync is completed.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>     */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    void postSync();<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>     * triggered when the store is not able to write out data.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>     * the main process should abort.<a name="line.47"></a>
-<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    void abortProcess();<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  }<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>   * An Iterator over a collection of Procedure<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public interface ProcedureIterator {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    /**<a name="line.56"></a>
-<span class="sourceLineNo">057</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>     */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    void reset();<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>     * Returns true if the iterator has more elements.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>     * (In other words, returns true if next() would return a Procedure<a name="line.63"></a>
-<span class="sourceLineNo">064</span>     * rather than throwing an exception.)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>     * @return true if the iterator has more procedures<a name="line.65"></a>
-<span class="sourceLineNo">066</span>     */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    boolean hasNext();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>     * @return true if the iterator next element is a completed procedure.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>     */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    boolean isNextFinished();<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">037</span>   * &lt;p/&gt;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * The main process should register a listener and respond to the store events.<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public interface ProcedureStoreListener {<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>     * triggered when the store sync is completed.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>     */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    default void postSync() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>    /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>     * triggered when the store is not able to write out data. the main process should abort.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>     */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    default void abortProcess() {<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>    /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>     * Suggest that the upper layer should update the state of some procedures. Ignore this call<a name="line.55"></a>
+<span class="sourceLineNo">056</span>     * will not effect correctness but performance.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>     * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>     * For a WAL based ProcedureStore implementation, if all the procedures stored in a WAL file<a name="line.58"></a>
+<span class="sourceLineNo">059</span>     * have been deleted, or updated later in another WAL file, then we can delete the WAL file. If<a name="line.59"></a>
+<span class="sourceLineNo">060</span>     * there are old procedures in a WAL file which are never deleted or updated, then we can not<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * delete the WAL file and this will cause we hold lots of WAL file and slow down the master<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     * restarts. So here we introduce this method to tell the upper layer that please update the<a name="line.62"></a>
+<span class="sourceLineNo">063</span>     * states of these procedures so that we can delete the old WAL file.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>     * @param procIds the id for the procedures<a name="line.64"></a>
+<span class="sourceLineNo">065</span>     */<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    default void forceUpdate(long[] procIds) {<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><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * An Iterator over a collection of Procedure<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public interface ProcedureIterator {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>     * Skip the next procedure<a name="line.75"></a>
+<span class="sourceLineNo">075</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.75"></a>
 <span class="sourceLineNo">076</span>     */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    void skipNext();<a name="line.77"></a>
+<span class="sourceLineNo">077</span>    void reset();<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
 <span class="sourceLineNo">079</span>    /**<a name="line.79"></a>
-<span class="sourceLineNo">080</span>     * Returns the next procedure in the iteration.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.81"></a>
-<span class="sourceLineNo">082</span>     * @return the next procedure in the iteration.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    @SuppressWarnings("rawtypes")<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    Procedure next() throws IOException;<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>  /**<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public interface ProcedureLoader {<a name="line.91"></a>
+<span class="sourceLineNo">080</span>     * Returns true if the iterator has more elements.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>     * (In other words, returns true if next() would return a Procedure<a name="line.81"></a>
+<span class="sourceLineNo">082</span>     * rather than throwing an exception.)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>     * @return true if the iterator has more procedures<a name="line.83"></a>
+<span class="sourceLineNo">084</span>     */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    boolean hasNext();<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>     * @return true if the iterator next element is a completed procedure.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    boolean isNextFinished();<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>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @param maxProcId the highest proc-id in the store<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.106"></a>
-<span class="sourceLineNo">107</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Add the listener to the notification list.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param listener The AssignmentListener to register<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param listener The AssignmentListener to unregister<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  boolean unregisterListener(ProcedureStoreListener listener);<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * Start/Open the procedure store<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * @param numThreads<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param abort true if the stop is an abort<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  void stop(boolean abort);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return true if the store is running, otherwise false.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  int getNumThreads();<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>   * Set the number of procedure running.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.162"></a>
+<span class="sourceLineNo">093</span>     * Skip the next procedure<a name="line.93"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    void skipNext();<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>     * Returns the next procedure in the iteration.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.99"></a>
+<span class="sourceLineNo">100</span>     * @return the next procedure in the iteration.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>     */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @SuppressWarnings("rawtypes")<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    Procedure next() throws IOException;<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>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public interface ProcedureLoader {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    /**<a name="line.110"></a>
+<span class="sourceLineNo">111</span>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>     * @param maxProcId the highest proc-id in the store<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>     */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.124"></a>
+<span class="sourceLineNo">125</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.126"></a>
+<span class="sourceLineNo">127</span>     */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * Add the listener to the notification list.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param listener The AssignmentListener to register<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param listener The AssignmentListener to unregister<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  boolean unregisterListener(ProcedureStoreListener listener);<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>   * Start/Open the procedure store<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param numThreads<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param abort true if the stop is an abort<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  void stop(boolean abort);<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>   * @return true if the store is running, otherwise false.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.162"></a>
 <span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  void load(ProcedureLoader loader) throws IOException;<a name="line.164"></a>
+<span class="sourceLineNo">164</span>  int getNumThreads();<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param proc the procedure to serialize and write to the store.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param subprocs the newly created child of the proc.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param procs the procedures to serialize and write to the store.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  void insert(Procedure&lt;?&gt;[] procs);<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>   * The specified procedure was executed,<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * and the new state should be written to the store.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param proc the procedure to serialize and write to the store.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  void update(Procedure&lt;?&gt; proc);<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>   * The specified procId was removed from the executor,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * due to completion, abort or failure.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * The store implementor should remove all the information about the specified procId.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @param procId the ID of the procedure to remove.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  void delete(long procId);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * The parent procedure completed.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Update the state and mark all the child deleted.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /**<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * The specified procIds were removed from the executor,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * due to completion, abort or failure.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @param procIds the IDs of the procedures to remove.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param offset the array offset from where to start to delete<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @param count the number of IDs to delete<a name="line.217"></a>
+<span class="sourceLineNo">167</span>   * Set the number of procedure running.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  void load(ProcedureLoader loader) throws IOException;<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   *<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param proc the procedure to serialize and write to the store.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param subprocs the newly created child of the proc.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @param procs the procedures to serialize and write to the store.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  void insert(Procedure&lt;?&gt;[] procs);<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * The specified procedure was executed,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * and the new state should be written to the store.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param proc the procedure to serialize and write to the store.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  void update(Procedure&lt;?&gt; proc);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * The specified procId was removed from the executor,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * due to completion, abort or failure.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * The store implementor should remove all the information about the specified procId.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param procId the ID of the procedure to remove.<a name="line.217"></a>
 <span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  void delete(long[] procIds, int offset, int count);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>}<a name="line.220"></a>
+<span class="sourceLineNo">219</span>  void delete(long procId);<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>   * The parent procedure completed.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Update the state and mark all the child deleted.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<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>   * The specified procIds were removed from the executor,<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * due to completion, abort or failure.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param procIds the IDs of the procedures to remove.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param offset the array offset from where to start to delete<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param count the number of IDs to delete<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  void delete(long[] procIds, int offset, int count);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>}<a name="line.238"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
index ff29160..e4dc134 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html
@@ -42,190 +42,208 @@
 <span class="sourceLineNo">034</span>public interface ProcedureStore {<a name="line.34"></a>
 <span class="sourceLineNo">035</span>  /**<a name="line.35"></a>
 <span class="sourceLineNo">036</span>   * Store listener interface.<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   * The main process should register a listener and respond to the store events.<a name="line.37"></a>
-<span class="sourceLineNo">038</span>   */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public interface ProcedureStoreListener {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>     * triggered when the store sync is completed.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>     */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    void postSync();<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>     * triggered when the store is not able to write out data.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>     * the main process should abort.<a name="line.47"></a>
-<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    void abortProcess();<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  }<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>   * An Iterator over a collection of Procedure<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public interface ProcedureIterator {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    /**<a name="line.56"></a>
-<span class="sourceLineNo">057</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>     */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    void reset();<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>     * Returns true if the iterator has more elements.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>     * (In other words, returns true if next() would return a Procedure<a name="line.63"></a>
-<span class="sourceLineNo">064</span>     * rather than throwing an exception.)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>     * @return true if the iterator has more procedures<a name="line.65"></a>
-<span class="sourceLineNo">066</span>     */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    boolean hasNext();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>     * @return true if the iterator next element is a completed procedure.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>     */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    boolean isNextFinished();<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">037</span>   * &lt;p/&gt;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * The main process should register a listener and respond to the store events.<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public interface ProcedureStoreListener {<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>     * triggered when the store sync is completed.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>     */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    default void postSync() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>    /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>     * triggered when the store is not able to write out data. the main process should abort.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>     */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    default void abortProcess() {<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>    /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>     * Suggest that the upper layer should update the state of some procedures. Ignore this call<a name="line.55"></a>
+<span class="sourceLineNo">056</span>     * will not effect correctness but performance.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>     * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>     * For a WAL based ProcedureStore implementation, if all the procedures stored in a WAL file<a name="line.58"></a>
+<span class="sourceLineNo">059</span>     * have been deleted, or updated later in another WAL file, then we can delete the WAL file. If<a name="line.59"></a>
+<span class="sourceLineNo">060</span>     * there are old procedures in a WAL file which are never deleted or updated, then we can not<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * delete the WAL file and this will cause we hold lots of WAL file and slow down the master<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     * restarts. So here we introduce this method to tell the upper layer that please update the<a name="line.62"></a>
+<span class="sourceLineNo">063</span>     * states of these procedures so that we can delete the old WAL file.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>     * @param procIds the id for the procedures<a name="line.64"></a>
+<span class="sourceLineNo">065</span>     */<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    default void forceUpdate(long[] procIds) {<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><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * An Iterator over a collection of Procedure<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public interface ProcedureIterator {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>     * Skip the next procedure<a name="line.75"></a>
+<span class="sourceLineNo">075</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.75"></a>
 <span class="sourceLineNo">076</span>     */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    void skipNext();<a name="line.77"></a>
+<span class="sourceLineNo">077</span>    void reset();<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
 <span class="sourceLineNo">079</span>    /**<a name="line.79"></a>
-<span class="sourceLineNo">080</span>     * Returns the next procedure in the iteration.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.81"></a>
-<span class="sourceLineNo">082</span>     * @return the next procedure in the iteration.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    @SuppressWarnings("rawtypes")<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    Procedure next() throws IOException;<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>  /**<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public interface ProcedureLoader {<a name="line.91"></a>
+<span class="sourceLineNo">080</span>     * Returns true if the iterator has more elements.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>     * (In other words, returns true if next() would return a Procedure<a name="line.81"></a>
+<span class="sourceLineNo">082</span>     * rather than throwing an exception.)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>     * @return true if the iterator has more procedures<a name="line.83"></a>
+<span class="sourceLineNo">084</span>     */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    boolean hasNext();<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>     * @return true if the iterator next element is a completed procedure.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    boolean isNextFinished();<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>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @param maxProcId the highest proc-id in the store<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.106"></a>
-<span class="sourceLineNo">107</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Add the listener to the notification list.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param listener The AssignmentListener to register<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param listener The AssignmentListener to unregister<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  boolean unregisterListener(ProcedureStoreListener listener);<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * Start/Open the procedure store<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * @param numThreads<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param abort true if the stop is an abort<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  void stop(boolean abort);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return true if the store is running, otherwise false.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  int getNumThreads();<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>   * Set the number of procedure running.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.162"></a>
+<span class="sourceLineNo">093</span>     * Skip the next procedure<a name="line.93"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    void skipNext();<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>     * Returns the next procedure in the iteration.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.99"></a>
+<span class="sourceLineNo">100</span>     * @return the next procedure in the iteration.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>     */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @SuppressWarnings("rawtypes")<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    Procedure next() throws IOException;<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>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public interface ProcedureLoader {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    /**<a name="line.110"></a>
+<span class="sourceLineNo">111</span>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>     * @param maxProcId the highest proc-id in the store<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>     */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.124"></a>
+<span class="sourceLineNo">125</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.126"></a>
+<span class="sourceLineNo">127</span>     */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * Add the listener to the notification list.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param listener The AssignmentListener to register<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param listener The AssignmentListener to unregister<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  boolean unregisterListener(ProcedureStoreListener listener);<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>   * Start/Open the procedure store<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param numThreads<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param abort true if the stop is an abort<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  void stop(boolean abort);<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>   * @return true if the store is running, otherwise false.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.162"></a>
 <span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  void load(ProcedureLoader loader) throws IOException;<a name="line.164"></a>
+<span class="sourceLineNo">164</span>  int getNumThreads();<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param proc the procedure to serialize and write to the store.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param subprocs the newly created child of the proc.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param procs the procedures to serialize and write to the store.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  void insert(Procedure&lt;?&gt;[] procs);<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>   * The specified procedure was executed,<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * and the new state should be written to the store.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param proc the procedure to serialize and write to the store.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  void update(Procedure&lt;?&gt; proc);<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>   * The specified procId was removed from the executor,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * due to completion, abort or failure.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * The store implementor should remove all the information about the specified procId.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @param procId the ID of the procedure to remove.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  void delete(long procId);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * The parent procedure completed.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Update the state and mark all the child deleted.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /**<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * The specified procIds were removed from the executor,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * due to completion, abort or failure.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @param procIds the IDs of the procedures to remove.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param offset the array offset from where to start to delete<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @param count the number of IDs to delete<a name="line.217"></a>
+<span class="sourceLineNo">167</span>   * Set the number of procedure running.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  void load(ProcedureLoader loader) throws IOException;<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   *<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param proc the procedure to serialize and write to the store.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param subprocs the newly created child of the proc.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @param procs the procedures to serialize and write to the store.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  void insert(Procedure&lt;?&gt;[] procs);<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * The specified procedure was executed,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * and the new state should be written to the store.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param proc the procedure to serialize and write to the store.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  void update(Procedure&lt;?&gt; proc);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * The specified procId was removed from the executor,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * due to completion, abort or failure.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * The store implementor should remove all the information about the specified procId.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param procId the ID of the procedure to remove.<a name="line.217"></a>
 <span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  void delete(long[] procIds, int offset, int count);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>}<a name="line.220"></a>
+<span class="sourceLineNo">219</span>  void delete(long procId);<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>   * The parent procedure completed.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Update the state and mark all the child deleted.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<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>   * The specified procIds were removed from the executor,<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * due to completion, abort or failure.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param procIds the IDs of the procedures to remove.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param offset the array offset from where to start to delete<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param count the number of IDs to delete<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  void delete(long[] procIds, int offset, int count);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>}<a name="line.238"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
index 6193604..6a97b38 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html
@@ -23,65 +23,59 @@
 <span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
 <span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
 <span class="sourceLineNo">017</span> */<a name="line.17"></a>
-<span class="sourceLineNo">018</span><a name="line.18"></a>
-<span class="sourceLineNo">019</span>package org.apache.hadoop.hbase.procedure2.store;<a name="line.19"></a>
-<span class="sourceLineNo">020</span><a name="line.20"></a>
-<span class="sourceLineNo">021</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.21"></a>
-<span class="sourceLineNo">022</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.22"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.procedure2.store;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.22"></a>
 <span class="sourceLineNo">023</span><a name="line.23"></a>
-<span class="sourceLineNo">024</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.24"></a>
-<span class="sourceLineNo">025</span><a name="line.25"></a>
-<span class="sourceLineNo">026</span>/**<a name="line.26"></a>
-<span class="sourceLineNo">027</span> * Base class for {@link ProcedureStore}s.<a name="line.27"></a>
-<span class="sourceLineNo">028</span> */<a name="line.28"></a>
-<span class="sourceLineNo">029</span>@InterfaceAudience.Private<a name="line.29"></a>
-<span class="sourceLineNo">030</span>public abstract class ProcedureStoreBase implements ProcedureStore {<a name="line.30"></a>
-<span class="sourceLineNo">031</span>  private final CopyOnWriteArrayList&lt;ProcedureStoreListener&gt; listeners = new CopyOnWriteArrayList&lt;&gt;();<a name="line.31"></a>
+<span class="sourceLineNo">024</span>/**<a name="line.24"></a>
+<span class="sourceLineNo">025</span> * Base class for {@link ProcedureStore}s.<a name="line.25"></a>
+<span class="sourceLineNo">026</span> */<a name="line.26"></a>
+<span class="sourceLineNo">027</span>@InterfaceAudience.Private<a name="line.27"></a>
+<span class="sourceLineNo">028</span>public abstract class ProcedureStoreBase implements ProcedureStore {<a name="line.28"></a>
+<span class="sourceLineNo">029</span>  private final CopyOnWriteArrayList&lt;ProcedureStoreListener&gt; listeners = new CopyOnWriteArrayList&lt;&gt;();<a name="line.29"></a>
+<span class="sourceLineNo">030</span><a name="line.30"></a>
+<span class="sourceLineNo">031</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.31"></a>
 <span class="sourceLineNo">032</span><a name="line.32"></a>
-<span class="sourceLineNo">033</span>  private final AtomicBoolean running = new AtomicBoolean(false);<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>   * Change the state to 'isRunning',<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   * returns true if the store state was changed,<a name="line.37"></a>
-<span class="sourceLineNo">038</span>   * false if the store was already in that state.<a name="line.38"></a>
-<span class="sourceLineNo">039</span>   * @param isRunning the state to set.<a name="line.39"></a>
-<span class="sourceLineNo">040</span>   * @return true if the store state was changed, otherwise false.<a name="line.40"></a>
-<span class="sourceLineNo">041</span>   */<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  protected boolean setRunning(boolean isRunning) {<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    return running.getAndSet(isRunning) != isRunning;<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>  @Override<a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public boolean isRunning() {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    return running.get();<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  }<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  @Override<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  public void registerListener(ProcedureStoreListener listener) {<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    listeners.add(listener);<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>  @Override<a name="line.56"></a>
-<span class="sourceLineNo">057</span>  public boolean unregisterListener(ProcedureStoreListener listener) {<a name="line.57"></a>
-<span class="sourceLineNo">058</span>    return listeners.remove(listener);<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>  protected void sendPostSyncSignal() {<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    if (!this.listeners.isEmpty()) {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      for (ProcedureStoreListener listener : this.listeners) {<a name="line.63"></a>
-<span class="sourceLineNo">064</span>        listener.postSync();<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>  }<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>  protected void sendAbortProcessSignal() {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    if (!this.listeners.isEmpty()) {<a name="line.70"></a>
-<span class="sourceLineNo">071</span>      for (ProcedureStoreListener listener : this.listeners) {<a name="line.71"></a>
-<span class="sourceLineNo">072</span>        listener.abortProcess();<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>  }<a name="line.75"></a>
-<span class="sourceLineNo">076</span>}<a name="line.76"></a>
+<span class="sourceLineNo">033</span>  /**<a name="line.33"></a>
+<span class="sourceLineNo">034</span>   * Change the state to 'isRunning',<a name="line.34"></a>
+<span class="sourceLineNo">035</span>   * returns true if the store state was changed,<a name="line.35"></a>
+<span class="sourceLineNo">036</span>   * false if the store was already in that state.<a name="line.36"></a>
+<span class="sourceLineNo">037</span>   * @param isRunning the state to set.<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * @return true if the store state was changed, otherwise false.<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  protected boolean setRunning(boolean isRunning) {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>    return running.getAndSet(isRunning) != isRunning;<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>  @Override<a name="line.44"></a>
+<span class="sourceLineNo">045</span>  public boolean isRunning() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    return running.get();<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>  @Override<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  public void registerListener(ProcedureStoreListener listener) {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    listeners.add(listener);<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 boolean unregisterListener(ProcedureStoreListener listener) {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    return listeners.remove(listener);<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>  protected final void sendPostSyncSignal() {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    listeners.forEach(ProcedureStoreListener::postSync);<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>  protected final void sendAbortProcessSignal() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    listeners.forEach(ProcedureStoreListener::abortProcess);<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>  protected final void sendForceUpdateSignal(long[] procIds) {<a name="line.67"></a>
+<span class="sourceLineNo">068</span>    listeners.forEach(l -&gt; l.forceUpdate(procIds));<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>
 
 
 


[51/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/d1341859
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/d1341859
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/d1341859

Branch: refs/heads/asf-site
Commit: d13418593a425779d01a762e190543ca9c2f7a6f
Parents: 9ab80c1
Author: jenkins <bu...@apache.org>
Authored: Fri Oct 12 14:52:36 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Fri Oct 12 14:52:36 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |     4 +-
 apache_hbase_reference_guide.pdf                |     4 +-
 book.html                                       |     2 +-
 bulk-loads.html                                 |     4 +-
 checkstyle-aggregate.html                       | 12796 ++++++++---------
 checkstyle.rss                                  |    36 +-
 coc.html                                        |     4 +-
 dependencies.html                               |     4 +-
 dependency-convergence.html                     |     8 +-
 dependency-info.html                            |     4 +-
 dependency-management.html                      |    26 +-
 devapidocs/allclasses-frame.html                |     2 +-
 devapidocs/allclasses-noframe.html              |     2 +-
 devapidocs/constant-values.html                 |    55 +-
 devapidocs/index-all.html                       |    71 +-
 .../hadoop/hbase/backup/package-tree.html       |     4 +-
 .../hadoop/hbase/client/package-tree.html       |    24 +-
 .../hadoop/hbase/coprocessor/package-tree.html  |     2 +-
 .../hadoop/hbase/executor/package-tree.html     |     2 +-
 .../hadoop/hbase/filter/package-tree.html       |     8 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |     6 +-
 .../apache/hadoop/hbase/ipc/package-tree.html   |     2 +-
 .../hadoop/hbase/mapreduce/package-tree.html    |     2 +-
 .../master/HMaster.InitializationMonitor.html   |    20 +-
 .../master/HMaster.MasterStoppedException.html  |     4 +-
 .../hbase/master/HMaster.RedirectServlet.html   |    12 +-
 .../master/HMaster.TableDescriptorGetter.html   |     4 +-
 .../org/apache/hadoop/hbase/master/HMaster.html |   488 +-
 .../hbase/master/balancer/package-tree.html     |     2 +-
 .../hbase/master/class-use/MasterServices.html  |    13 +-
 .../hadoop/hbase/master/package-tree.html       |     4 +-
 ...ocedureEnv.MasterProcedureStoreListener.html |   348 -
 ...asterProcedureEnv.WALStoreLeaseRecovery.html |    14 +-
 .../master/procedure/MasterProcedureEnv.html    |    50 +-
 ...ocedureEnv.MasterProcedureStoreListener.html |   125 -
 .../hbase/master/procedure/package-frame.html   |     1 -
 .../hbase/master/procedure/package-summary.html |    58 +-
 .../hbase/master/procedure/package-tree.html    |     3 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    16 +-
 ...edureExecutor.CompletedProcedureCleaner.html |    32 +-
 ...dureExecutor.CompletedProcedureRetainer.html |    18 +-
 .../ProcedureExecutor.FailedProcedure.html      |    20 +-
 ...ProcedureExecutor.KeepAliveWorkerThread.html |     6 +-
 ...edureExecutor.ProcedureExecutorListener.html |     8 +-
 .../procedure2/ProcedureExecutor.Testing.html   |    24 +-
 .../ProcedureExecutor.WorkerMonitor.html        |    32 +-
 .../ProcedureExecutor.WorkerThread.html         |    20 +-
 .../hbase/procedure2/ProcedureExecutor.html     |   379 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     6 +-
 .../hbase/procedure2/store/BitSetNode.html      |   117 +-
 .../procedure2/store/NoopProcedureStore.html    |     2 +-
 .../store/ProcedureStore.ProcedureIterator.html |    12 +-
 .../store/ProcedureStore.ProcedureLoader.html   |     8 +-
 .../ProcedureStore.ProcedureStoreListener.html  |    54 +-
 .../hbase/procedure2/store/ProcedureStore.html  |    30 +-
 .../procedure2/store/ProcedureStoreBase.html    |    41 +-
 .../ProcedureStoreTracker.DeleteState.html      |    12 +-
 .../procedure2/store/ProcedureStoreTracker.html |   165 +-
 .../ProcedureStore.ProcedureStoreListener.html  |    22 -
 .../hbase/procedure2/store/package-use.html     |    25 +-
 .../wal/WALProcedureStore.LeaseRecovery.html    |     4 +-
 .../store/wal/WALProcedureStore.PushType.html   |    12 +-
 .../wal/WALProcedureStore.SyncMetrics.html      |    24 +-
 .../procedure2/store/wal/WALProcedureStore.html |   263 +-
 .../hadoop/hbase/quotas/package-tree.html       |     8 +-
 .../hadoop/hbase/regionserver/package-tree.html |    18 +-
 .../regionserver/querymatcher/package-tree.html |     2 +-
 .../hbase/regionserver/wal/AbstractFSWAL.html   |   116 +-
 .../hbase/regionserver/wal/package-tree.html    |     4 +-
 .../hadoop/hbase/replication/package-tree.html  |     2 +-
 .../replication/regionserver/package-tree.html  |     2 +-
 .../hadoop/hbase/security/package-tree.html     |     2 +-
 .../hbase/util/JVMClusterUtil.MasterThread.html |     8 +-
 .../util/JVMClusterUtil.RegionServerThread.html |    10 +-
 .../hadoop/hbase/util/JVMClusterUtil.html       |    50 +-
 .../hadoop/hbase/util/PrettyPrinter.Unit.html   |     4 +-
 .../org/apache/hadoop/hbase/util/Random64.html  |   437 +
 .../hbase/util/ReadOnlyByteRangeException.html  |     4 +-
 .../hadoop/hbase/util/class-use/Random64.html   |   125 +
 .../apache/hadoop/hbase/util/package-frame.html |     1 +
 .../hadoop/hbase/util/package-summary.html      |    97 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    11 +-
 ...oupingProvider.IdentityGroupingStrategy.html |     8 +-
 .../hbase/wal/RegionGroupingProvider.html       |    71 +-
 .../org/apache/hadoop/hbase/wal/WALFactory.html |   125 +-
 .../hadoop/hbase/wal/class-use/WALProvider.html |     9 +-
 devapidocs/overview-tree.html                   |     2 +-
 .../org/apache/hadoop/hbase/Version.html        |     4 +-
 .../master/HMaster.InitializationMonitor.html   |  7331 +++++-----
 .../master/HMaster.MasterStoppedException.html  |  7331 +++++-----
 .../hbase/master/HMaster.RedirectServlet.html   |  7331 +++++-----
 .../master/HMaster.TableDescriptorGetter.html   |  7331 +++++-----
 .../org/apache/hadoop/hbase/master/HMaster.html |  7331 +++++-----
 ...ocedureEnv.MasterProcedureStoreListener.html |   244 -
 ...asterProcedureEnv.WALStoreLeaseRecovery.html |   237 +-
 .../master/procedure/MasterProcedureEnv.html    |   237 +-
 ...edureExecutor.CompletedProcedureCleaner.html |  4167 +++---
 ...dureExecutor.CompletedProcedureRetainer.html |  4167 +++---
 .../ProcedureExecutor.FailedProcedure.html      |  4167 +++---
 ...ProcedureExecutor.KeepAliveWorkerThread.html |  4167 +++---
 ...edureExecutor.ProcedureExecutorListener.html |  4167 +++---
 .../procedure2/ProcedureExecutor.Testing.html   |  4167 +++---
 .../ProcedureExecutor.WorkerMonitor.html        |  4167 +++---
 .../ProcedureExecutor.WorkerThread.html         |  4167 +++---
 .../hbase/procedure2/ProcedureExecutor.html     |  4167 +++---
 .../hbase/procedure2/store/BitSetNode.html      |   757 +-
 .../store/ProcedureStore.ProcedureIterator.html |   368 +-
 .../store/ProcedureStore.ProcedureLoader.html   |   368 +-
 .../ProcedureStore.ProcedureStoreListener.html  |   368 +-
 .../hbase/procedure2/store/ProcedureStore.html  |   368 +-
 .../procedure2/store/ProcedureStoreBase.html    |   108 +-
 .../ProcedureStoreTracker.DeleteState.html      |   843 +-
 .../procedure2/store/ProcedureStoreTracker.html |   843 +-
 .../wal/WALProcedureStore.LeaseRecovery.html    |  2594 ++--
 .../store/wal/WALProcedureStore.PushType.html   |  2594 ++--
 .../wal/WALProcedureStore.SyncMetrics.html      |  2594 ++--
 .../procedure2/store/wal/WALProcedureStore.html |  2594 ++--
 .../wal/AbstractFSWAL.WalProps.html             |  1391 +-
 .../hbase/regionserver/wal/AbstractFSWAL.html   |  1391 +-
 .../hbase/util/JVMClusterUtil.MasterThread.html |   625 +-
 .../util/JVMClusterUtil.RegionServerThread.html |   625 +-
 .../hadoop/hbase/util/JVMClusterUtil.html       |   625 +-
 .../org/apache/hadoop/hbase/util/Random64.html  |   221 +
 ...oupingProvider.IdentityGroupingStrategy.html |   325 +-
 ...GroupingProvider.RegionGroupingStrategy.html |   325 +-
 .../wal/RegionGroupingProvider.Strategies.html  |   325 +-
 .../hbase/wal/RegionGroupingProvider.html       |   325 +-
 .../hadoop/hbase/wal/WALFactory.Providers.html  |   816 +-
 .../org/apache/hadoop/hbase/wal/WALFactory.html |   816 +-
 downloads.html                                  |     4 +-
 export_control.html                             |     4 +-
 index.html                                      |     4 +-
 integration.html                                |     4 +-
 issue-tracking.html                             |     4 +-
 license.html                                    |     4 +-
 mail-lists.html                                 |     4 +-
 metrics.html                                    |     4 +-
 old_news.html                                   |     4 +-
 plugin-management.html                          |     4 +-
 plugins.html                                    |     4 +-
 poweredbyhbase.html                             |     4 +-
 project-info.html                               |     4 +-
 project-reports.html                            |     4 +-
 project-summary.html                            |     4 +-
 pseudo-distributed.html                         |     4 +-
 replication.html                                |     4 +-
 resources.html                                  |     4 +-
 source-repository.html                          |     4 +-
 sponsors.html                                   |     4 +-
 supportingprojects.html                         |     4 +-
 team-list.html                                  |     4 +-
 testdevapidocs/allclasses-frame.html            |     4 +
 testdevapidocs/allclasses-noframe.html          |     4 +
 testdevapidocs/constant-values.html             |     7 +
 testdevapidocs/index-all.html                   |    90 +-
 .../hadoop/hbase/backup/package-tree.html       |     2 +-
 .../chaos/actions/Action.ActionContext.html     |    12 +-
 .../hadoop/hbase/chaos/actions/Action.html      |   110 +-
 .../hbase/class-use/HBaseClassTestRule.html     |     4 +
 .../class-use/HBaseCommonTestingUtility.html    |     4 +
 .../hadoop/hbase/io/hfile/package-tree.html     |     2 +-
 ...MockMasterServices.MockRegionStateStore.html |     6 +-
 .../master/assignment/MockMasterServices.html   |    70 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    12 +-
 .../hadoop/hbase/procedure2/package-tree.html   |     2 +-
 .../store/TestProcedureStoreTracker.html        |    97 +-
 ...manceEvaluation.NoSyncWalProcedureStore.html |     2 +-
 ...rocedureWALPerformanceEvaluation.Worker.html |     4 +-
 ...tForceUpdateProcedure.ExchangeProcedure.html |   412 +
 ...estForceUpdateProcedure.ParentProcedure.html |   412 +
 ...stForceUpdateProcedure.WaitingProcedure.html |   412 +
 .../store/wal/TestForceUpdateProcedure.html     |   474 +
 .../store/wal/TestStressWALProcedureStore.html  |     4 +-
 ...tForceUpdateProcedure.ExchangeProcedure.html |   125 +
 ...estForceUpdateProcedure.ParentProcedure.html |   125 +
 ...stForceUpdateProcedure.WaitingProcedure.html |   125 +
 .../wal/class-use/TestForceUpdateProcedure.html |   125 +
 .../procedure2/store/wal/package-frame.html     |     4 +
 .../procedure2/store/wal/package-summary.html   |    16 +
 .../procedure2/store/wal/package-tree.html      |     4 +
 .../hadoop/hbase/regionserver/package-tree.html |     4 +-
 .../IntegrationTestBigLinkedList.CINode.html    |    12 +-
 .../IntegrationTestBigLinkedList.Clean.html     |     6 +-
 .../IntegrationTestBigLinkedList.Delete.html    |     6 +-
 ...ationTestBigLinkedList.Generator.Counts.html |    14 +-
 ...eneratorInputFormat.GeneratorInputSplit.html |    12 +-
 ...eratorInputFormat.GeneratorRecordReader.html |    24 +-
 ...nkedList.Generator.GeneratorInputFormat.html |     8 +-
 ...erator.GeneratorMapper.ConcurrentWalker.html |     8 +-
 ...eratorMapper.ContinuousConcurrentWalker.html |    18 +-
 ...BigLinkedList.Generator.GeneratorMapper.html |    60 +-
 ...nkedList.Generator.OneFilePerMapperSFIF.html |     6 +-
 .../IntegrationTestBigLinkedList.Generator.html |    57 +-
 .../test/IntegrationTestBigLinkedList.Loop.html |    16 +-
 .../IntegrationTestBigLinkedList.Print.html     |     6 +-
 ...st.Search.WALSearcher.WALMapperSearcher.html |    12 +-
 ...ionTestBigLinkedList.Search.WALSearcher.html |     6 +-
 .../IntegrationTestBigLinkedList.Search.html    |    22 +-
 ...egrationTestBigLinkedList.Verify.Counts.html |    20 +-
 ...onTestBigLinkedList.Verify.VerifyMapper.html |    14 +-
 ...nTestBigLinkedList.Verify.VerifyReducer.html |    28 +-
 .../IntegrationTestBigLinkedList.Verify.html    |    26 +-
 .../IntegrationTestBigLinkedList.Walker.html    |     6 +-
 ...IntegrationTestBigLinkedList.WalkerBase.html |     8 +-
 .../test/IntegrationTestBigLinkedList.html      |    80 +-
 ...dListWithVisibility.VisibilityGenerator.html |     2 +-
 .../apache/hadoop/hbase/test/package-tree.html  |     4 +-
 .../wal/IOTestProvider.AllowedOperations.html   |    16 +-
 .../hbase/wal/IOTestProvider.IOTestWAL.html     |    12 +-
 .../hbase/wal/IOTestProvider.IOTestWriter.html  |    16 +-
 .../apache/hadoop/hbase/wal/IOTestProvider.html |    55 +-
 .../apache/hadoop/hbase/wal/TestWALFactory.html |    62 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |     4 +-
 testdevapidocs/overview-tree.html               |     4 +
 .../chaos/actions/Action.ActionContext.html     |   625 +-
 .../hadoop/hbase/chaos/actions/Action.html      |   625 +-
 ...MockMasterServices.MockRegionStateStore.html |   649 +-
 .../master/assignment/MockMasterServices.html   |   649 +-
 .../store/TestProcedureStoreTracker.html        |   118 +-
 ...tForceUpdateProcedure.ExchangeProcedure.html |   289 +
 ...estForceUpdateProcedure.ParentProcedure.html |   289 +
 ...stForceUpdateProcedure.WaitingProcedure.html |   289 +
 .../store/wal/TestForceUpdateProcedure.html     |   289 +
 .../IntegrationTestBigLinkedList.CINode.html    |  3756 ++---
 .../IntegrationTestBigLinkedList.Clean.html     |  3756 ++---
 .../IntegrationTestBigLinkedList.Delete.html    |  3756 ++---
 ...ationTestBigLinkedList.Generator.Counts.html |  3756 ++---
 ...eneratorInputFormat.GeneratorInputSplit.html |  3756 ++---
 ...eratorInputFormat.GeneratorRecordReader.html |  3756 ++---
 ...nkedList.Generator.GeneratorInputFormat.html |  3756 ++---
 ...erator.GeneratorMapper.ConcurrentWalker.html |  3756 ++---
 ...eratorMapper.ContinuousConcurrentWalker.html |  3756 ++---
 ...BigLinkedList.Generator.GeneratorMapper.html |  3756 ++---
 ...nkedList.Generator.OneFilePerMapperSFIF.html |  3756 ++---
 .../IntegrationTestBigLinkedList.Generator.html |  3756 ++---
 .../test/IntegrationTestBigLinkedList.Loop.html |  3756 ++---
 .../IntegrationTestBigLinkedList.Print.html     |  3756 ++---
 ...st.Search.WALSearcher.WALMapperSearcher.html |  3756 ++---
 ...ionTestBigLinkedList.Search.WALSearcher.html |  3756 ++---
 .../IntegrationTestBigLinkedList.Search.html    |  3756 ++---
 ...egrationTestBigLinkedList.Verify.Counts.html |  3756 ++---
 ...onTestBigLinkedList.Verify.VerifyMapper.html |  3756 ++---
 ...nTestBigLinkedList.Verify.VerifyReducer.html |  3756 ++---
 .../IntegrationTestBigLinkedList.Verify.html    |  3756 ++---
 .../IntegrationTestBigLinkedList.Walker.html    |  3756 ++---
 ...IntegrationTestBigLinkedList.WalkerBase.html |  3756 ++---
 .../test/IntegrationTestBigLinkedList.html      |  3756 ++---
 .../wal/IOTestProvider.AllowedOperations.html   |   511 +-
 .../hbase/wal/IOTestProvider.IOTestWAL.html     |   511 +-
 .../hbase/wal/IOTestProvider.IOTestWriter.html  |   511 +-
 .../apache/hadoop/hbase/wal/IOTestProvider.html |   511 +-
 .../TestWALFactory.DumbWALActionsListener.html  |   153 +-
 .../apache/hadoop/hbase/wal/TestWALFactory.html |   153 +-
 253 files changed, 109183 insertions(+), 104320 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 839d473..d4191ac 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 486e94a..f774a9a 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:20181011143327+00'00')
-/CreationDate (D:20181011144919+00'00')
+/ModDate (D:20181012143323+00'00')
+/CreationDate (D:20181012144918+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 4d1b766..c400483 100644
--- a/book.html
+++ b/book.html
@@ -41284,7 +41284,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 2018-10-11 14:33:27 UTC
+Last updated 2018-10-12 14:33:23 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 2573a48..a568cc6 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 


[15/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
index e1b183b..b456cd2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.SyncMetrics.html
@@ -53,1338 +53,1354 @@
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
 <span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.46"></a>
 <span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * WAL implementation of the ProcedureStore.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;p/&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * then {@link #load(ProcedureLoader)}.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;p/&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * the old wal files.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * the races if there are two master both wants to acquire the lease...<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;p/&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * comments of this method for more details.<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * &lt;p/&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> * &lt;p/&gt;<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;p/&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * the modified procedures for the new wal file.<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p/&gt;<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * with the tracker of every newer wal files, using the<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.100"></a>
-<span class="sourceLineNo">101</span> * files, then we can delete it.<a name="line.101"></a>
-<span class="sourceLineNo">102</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.102"></a>
-<span class="sourceLineNo">103</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.103"></a>
-<span class="sourceLineNo">104</span> */<a name="line.104"></a>
-<span class="sourceLineNo">105</span>@InterfaceAudience.Private<a name="line.105"></a>
-<span class="sourceLineNo">106</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public interface LeaseRecovery {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<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> * WAL implementation of the ProcedureStore.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p/&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * then {@link #load(ProcedureLoader)}.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;p/&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the old wal files.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * the races if there are two master both wants to acquire the lease...<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;p/&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * comments of this method for more details.<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;p/&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;p/&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;p/&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * the modified procedures for the new wal file.<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;p/&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * with the tracker of every newer wal files, using the<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.101"></a>
+<span class="sourceLineNo">102</span> * files, then we can delete it. This is because that, every time we call<a name="line.102"></a>
+<span class="sourceLineNo">103</span> * {@link ProcedureStore#insert(Procedure[])} or {@link ProcedureStore#update(Procedure)}, we will<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * persist the full state of a Procedure, so the earlier wal records for this procedure can all be<a name="line.104"></a>
+<span class="sourceLineNo">105</span> * deleted.<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.Private<a name="line.109"></a>
+<span class="sourceLineNo">110</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 64;<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  public interface LeaseRecovery {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<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>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.123"></a>
+<span class="sourceLineNo">121</span>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 10;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.127"></a>
+<span class="sourceLineNo">125</span>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.131"></a>
+<span class="sourceLineNo">129</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.131"></a>
 <span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.135"></a>
+<span class="sourceLineNo">133</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.135"></a>
 <span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.139"></a>
+<span class="sourceLineNo">137</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.143"></a>
+<span class="sourceLineNo">141</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.143"></a>
 <span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.156"></a>
+<span class="sourceLineNo">145</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.156"></a>
 <span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private final Condition waitCond = lock.newCondition();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  private final Condition slotCond = lock.newCondition();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private final Condition syncCond = lock.newCondition();<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  private final LeaseRecovery leaseRecovery;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final Configuration conf;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private final FileSystem fs;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private final Path walDir;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private final Path walArchiveDir;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  private final boolean enforceStreamCapability;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private FSDataOutputStream stream = null;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  private int runningProcCount = 1;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private long flushLogId = 0;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private int syncMaxSlot = 1;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private int slotIndex = 0;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private Thread syncThread;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ByteSlot[] slots;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private int walCountWarnThreshold;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private int maxRetriesBeforeRoll;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private int maxSyncFailureRoll;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  private int waitBeforeRoll;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private int rollRetries;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private int periodicRollMsec;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  private long rollThreshold;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private boolean useHsync;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private int syncWaitMsec;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // Variables used for UI display<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  public static class SyncMetrics {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private long timestamp;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    private long syncWaitMs;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private long totalSyncedBytes;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private int syncedEntries;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    private float syncedPerSec;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>    public long getTimestamp() {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      return timestamp;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">158</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  private final Condition waitCond = lock.newCondition();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private final Condition slotCond = lock.newCondition();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  private final Condition syncCond = lock.newCondition();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  private final LeaseRecovery leaseRecovery;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private final Configuration conf;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  private final FileSystem fs;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private final Path walDir;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private final Path walArchiveDir;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  private final boolean enforceStreamCapability;<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private FSDataOutputStream stream = null;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  private int runningProcCount = 1;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  private long flushLogId = 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private int syncMaxSlot = 1;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private int slotIndex = 0;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private Thread syncThread;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  private ByteSlot[] slots;<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private int walCountWarnThreshold;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private int maxRetriesBeforeRoll;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private int maxSyncFailureRoll;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private int waitBeforeRoll;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private int rollRetries;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private int periodicRollMsec;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private long rollThreshold;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private boolean useHsync;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private int syncWaitMsec;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  // Variables used for UI display<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  public static class SyncMetrics {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private long timestamp;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    private long syncWaitMs;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private long totalSyncedBytes;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private int syncedEntries;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    private float syncedPerSec;<a name="line.212"></a>
 <span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public long getSyncWaitMs() {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      return syncWaitMs;<a name="line.215"></a>
+<span class="sourceLineNo">214</span>    public long getTimestamp() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return timestamp;<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>    public long getTotalSyncedBytes() {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      return totalSyncedBytes;<a name="line.219"></a>
+<span class="sourceLineNo">218</span>    public long getSyncWaitMs() {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return syncWaitMs;<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>    public long getSyncedEntries() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return syncedEntries;<a name="line.223"></a>
+<span class="sourceLineNo">222</span>    public long getTotalSyncedBytes() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return totalSyncedBytes;<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>    public float getSyncedPerSec() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return syncedPerSec;<a name="line.227"></a>
+<span class="sourceLineNo">226</span>    public long getSyncedEntries() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return syncedEntries;<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this(conf,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        leaseRecovery);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @VisibleForTesting<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    this.conf = conf;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.leaseRecovery = leaseRecovery;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.walDir = walDir;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.walArchiveDir = walArchiveDir;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    this.fs = walDir.getFileSystem(conf);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Create the log directory for the procedure store<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (!fs.exists(walDir)) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      if (!fs.mkdirs(walDir)) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Now that it exists, set the log policy<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    String storagePolicy =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>
-<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public void start(int numSlots) throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    if (!setRunning(true)) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // Init buffer slots<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    loading.set(true);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    runningProcCount = numSlots;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    syncMaxSlot = numSlots;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    slots = new ByteSlot[numSlots];<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      slotsCache.offer(new ByteSlot());<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>    // Tunings<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    walCountWarnThreshold =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    maxRetriesBeforeRoll =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // WebUI<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.301"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    public float getSyncedPerSec() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return syncedPerSec;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this(conf,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        leaseRecovery);<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>  @VisibleForTesting<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    this.conf = conf;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    this.leaseRecovery = leaseRecovery;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.walDir = walDir;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.walArchiveDir = walArchiveDir;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.fs = walDir.getFileSystem(conf);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Create the log directory for the procedure store<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (!fs.exists(walDir)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (!fs.mkdirs(walDir)) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Unable to mkdir " + walDir);<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>    // Now that it exists, set the log policy<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    String storagePolicy =<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      } else {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>  }<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void start(int numSlots) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    if (!setRunning(true)) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      return;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Init buffer slots<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    loading.set(true);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    runningProcCount = numSlots;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    syncMaxSlot = numSlots;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    slots = new ByteSlot[numSlots];<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      slotsCache.offer(new ByteSlot());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // Tunings<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    walCountWarnThreshold =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    maxRetriesBeforeRoll =<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.301"></a>
 <span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // Init sync thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      @Override<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      public void run() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          syncLoop();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        } catch (Throwable e) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          if (!isSyncAborted()) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            sendAbortProcessSignal();<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>    };<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    syncThread.start();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(final boolean abort) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!setRunning(false)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    sendStopSignal();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (!isSyncAborted()) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        while (syncThread.isAlive()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          sendStopSignal();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          syncThread.join(250);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      } catch (InterruptedException e) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        LOG.warn("join interrupted", e);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        Thread.currentThread().interrupt();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Close the writer<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    closeCurrentLogStream();<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Close the old logs<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    // they should be already closed, this is just in case the load fails<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // and we call start() and then stop()<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (ProcedureWALFile log: logs) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      log.close();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    logs.clear();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    loading.set(true);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void sendStopSignal() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (lock.tryLock()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      try {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        waitCond.signalAll();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        syncCond.signalAll();<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      } finally {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        lock.unlock();<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>  }<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>  public int getNumThreads() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    return slots == null ? 0 : slots.length;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Override<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public int setRunningProcedureCount(final int count) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return this.runningProcCount;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return storeTracker;<a name="line.377"></a>
+<span class="sourceLineNo">303</span>    // WebUI<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Init sync thread<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      public void run() {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          syncLoop();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        } catch (Throwable e) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if (!isSyncAborted()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            sendAbortProcessSignal();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          }<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    };<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    syncThread.start();<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void stop(final boolean abort) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (!setRunning(false)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    sendStopSignal();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (!isSyncAborted()) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        while (syncThread.isAlive()) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          sendStopSignal();<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          syncThread.join(250);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      } catch (InterruptedException e) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        LOG.warn("join interrupted", e);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Close the writer<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    closeCurrentLogStream();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Close the old logs<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // they should be already closed, this is just in case the load fails<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // and we call start() and then stop()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    for (ProcedureWALFile log: logs) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      log.close();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    logs.clear();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    loading.set(true);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private void sendStopSignal() {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    if (lock.tryLock()) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        waitCond.signalAll();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        syncCond.signalAll();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      } finally {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        lock.unlock();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public int getNumThreads() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return slots == null ? 0 : slots.length;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  @Override<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public int setRunningProcedureCount(final int count) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    return this.runningProcCount;<a name="line.377"></a>
 <span class="sourceLineNo">378</span>  }<a name="line.378"></a>
 <span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    lock.lock();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    try {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new ArrayList&lt;&gt;(logs);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    } finally {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      lock.unlock();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return corruptedLogs;<a name="line.390"></a>
+<span class="sourceLineNo">380</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    return storeTracker;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    lock.lock();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new ArrayList&lt;&gt;(logs);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } finally {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      lock.unlock();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
 <span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public void recoverLease() throws IOException {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    lock.lock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      boolean afterFirstAttempt = false;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      while (isRunning()) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        // Don't sleep before first attempt<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (afterFirstAttempt) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              waitBeforeRoll);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        } else {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          afterFirstAttempt = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        // Get Log-MaxID and recover lease on old logs<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          flushLogId = initOldLogs(oldLogs);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        } catch (FileNotFoundException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          continue;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Create new state-log<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          // someone else has already created this log<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          continue;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // We have the lease on the log<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        oldLogs = getLogFiles();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      lock.unlock();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    lock.lock();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    try {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      if (logs.isEmpty()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // Nothing to do, If we have only the current log.<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (logs.size() == 1) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        LOG.trace("No state logs to replay.");<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        loader.setMaxProcId(0);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        return;<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>      // Load the old logs<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      it.next(); // Skip the current log<a name="line.457"></a>
+<span class="sourceLineNo">393</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    return corruptedLogs;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public void recoverLease() throws IOException {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    lock.lock();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    try {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      boolean afterFirstAttempt = false;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      while (isRunning()) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // Don't sleep before first attempt<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (afterFirstAttempt) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.406"></a>
+<span class="sourceLineNo">407</span>              waitBeforeRoll);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          afterFirstAttempt = true;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        // Get Log-MaxID and recover lease on old logs<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          flushLogId = initOldLogs(oldLogs);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (FileNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          continue;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // Create new state-log<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          // someone else has already created this log<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // We have the lease on the log<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        oldLogs = getLogFiles();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        break;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    } finally {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      lock.unlock();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    lock.lock();<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (logs.isEmpty()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        throw new RuntimeException("recoverLease() must be called before loading data");<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>      // Nothing to do, If we have only the current log.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (logs.size() == 1) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        LOG.trace("No state logs to replay.");<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        loader.setMaxProcId(0);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>        @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        public void setMaxProcId(long maxProcId) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          loader.load(procIter);<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>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          loader.handleCorrupted(procIter);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>        @Override<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          if (corruptedLogs == null) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          corruptedLogs.add(log);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // TODO: sideline corrupted log<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      });<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    } finally {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      try {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // try to cleanup inactive wals and complete the operation<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        buildHoldingCleanupTracker();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        tryCleanupLogsOnLoad();<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        loading.set(false);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      } finally {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        lock.unlock();<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>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  private void tryCleanupLogsOnLoad() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // nothing to cleanup.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (logs.size() &lt;= 1) return;<a name="line.499"></a>
+<span class="sourceLineNo">459</span>      // Load the old logs<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      it.next(); // Skip the current log<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        @Override<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        public void setMaxProcId(long maxProcId) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          loader.load(procIter);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>        @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          loader.handleCorrupted(procIter);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>        @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          if (corruptedLogs == null) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>          corruptedLogs.add(log);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          // TODO: sideline corrupted log<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      });<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    } finally {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      try {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        // try to cleanup inactive wals and complete the operation<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        buildHoldingCleanupTracker();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        tryCleanupLogsOnLoad();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        loading.set(false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      } finally {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        lock.unlock();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
 <span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    // the config says to not cleanup wals on load.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return;<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>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      periodicRoll();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    } catch (IOException e) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.511"></a>
+<span class="sourceLineNo">501</span>  private void tryCleanupLogsOnLoad() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    // nothing to cleanup.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (logs.size() &lt;= 1) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return;<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>    // the config says to not cleanup wals on lo

<TRUNCATED>

[17/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
index e1b183b..b456cd2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html
@@ -53,1338 +53,1354 @@
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
 <span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.46"></a>
 <span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * WAL implementation of the ProcedureStore.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;p/&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * then {@link #load(ProcedureLoader)}.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;p/&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * the old wal files.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * the races if there are two master both wants to acquire the lease...<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;p/&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * comments of this method for more details.<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * &lt;p/&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> * &lt;p/&gt;<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;p/&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * the modified procedures for the new wal file.<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p/&gt;<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * with the tracker of every newer wal files, using the<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.100"></a>
-<span class="sourceLineNo">101</span> * files, then we can delete it.<a name="line.101"></a>
-<span class="sourceLineNo">102</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.102"></a>
-<span class="sourceLineNo">103</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.103"></a>
-<span class="sourceLineNo">104</span> */<a name="line.104"></a>
-<span class="sourceLineNo">105</span>@InterfaceAudience.Private<a name="line.105"></a>
-<span class="sourceLineNo">106</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public interface LeaseRecovery {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<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> * WAL implementation of the ProcedureStore.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p/&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * then {@link #load(ProcedureLoader)}.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;p/&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the old wal files.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * the races if there are two master both wants to acquire the lease...<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;p/&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * comments of this method for more details.<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;p/&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;p/&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;p/&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * the modified procedures for the new wal file.<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;p/&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * with the tracker of every newer wal files, using the<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.101"></a>
+<span class="sourceLineNo">102</span> * files, then we can delete it. This is because that, every time we call<a name="line.102"></a>
+<span class="sourceLineNo">103</span> * {@link ProcedureStore#insert(Procedure[])} or {@link ProcedureStore#update(Procedure)}, we will<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * persist the full state of a Procedure, so the earlier wal records for this procedure can all be<a name="line.104"></a>
+<span class="sourceLineNo">105</span> * deleted.<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.Private<a name="line.109"></a>
+<span class="sourceLineNo">110</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 64;<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  public interface LeaseRecovery {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<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>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.123"></a>
+<span class="sourceLineNo">121</span>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 10;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.127"></a>
+<span class="sourceLineNo">125</span>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.131"></a>
+<span class="sourceLineNo">129</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.131"></a>
 <span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.135"></a>
+<span class="sourceLineNo">133</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.135"></a>
 <span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.139"></a>
+<span class="sourceLineNo">137</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.143"></a>
+<span class="sourceLineNo">141</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.143"></a>
 <span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.156"></a>
+<span class="sourceLineNo">145</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.156"></a>
 <span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private final Condition waitCond = lock.newCondition();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  private final Condition slotCond = lock.newCondition();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private final Condition syncCond = lock.newCondition();<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  private final LeaseRecovery leaseRecovery;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final Configuration conf;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private final FileSystem fs;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private final Path walDir;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private final Path walArchiveDir;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  private final boolean enforceStreamCapability;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private FSDataOutputStream stream = null;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  private int runningProcCount = 1;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private long flushLogId = 0;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private int syncMaxSlot = 1;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private int slotIndex = 0;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private Thread syncThread;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ByteSlot[] slots;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private int walCountWarnThreshold;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private int maxRetriesBeforeRoll;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private int maxSyncFailureRoll;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  private int waitBeforeRoll;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private int rollRetries;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private int periodicRollMsec;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  private long rollThreshold;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private boolean useHsync;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private int syncWaitMsec;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // Variables used for UI display<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  public static class SyncMetrics {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private long timestamp;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    private long syncWaitMs;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private long totalSyncedBytes;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private int syncedEntries;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    private float syncedPerSec;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>    public long getTimestamp() {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      return timestamp;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">158</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  private final Condition waitCond = lock.newCondition();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private final Condition slotCond = lock.newCondition();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  private final Condition syncCond = lock.newCondition();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  private final LeaseRecovery leaseRecovery;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private final Configuration conf;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  private final FileSystem fs;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private final Path walDir;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private final Path walArchiveDir;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  private final boolean enforceStreamCapability;<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private FSDataOutputStream stream = null;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  private int runningProcCount = 1;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  private long flushLogId = 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private int syncMaxSlot = 1;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private int slotIndex = 0;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private Thread syncThread;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  private ByteSlot[] slots;<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private int walCountWarnThreshold;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private int maxRetriesBeforeRoll;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private int maxSyncFailureRoll;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private int waitBeforeRoll;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private int rollRetries;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private int periodicRollMsec;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private long rollThreshold;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private boolean useHsync;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private int syncWaitMsec;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  // Variables used for UI display<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  public static class SyncMetrics {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private long timestamp;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    private long syncWaitMs;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private long totalSyncedBytes;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private int syncedEntries;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    private float syncedPerSec;<a name="line.212"></a>
 <span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public long getSyncWaitMs() {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      return syncWaitMs;<a name="line.215"></a>
+<span class="sourceLineNo">214</span>    public long getTimestamp() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return timestamp;<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>    public long getTotalSyncedBytes() {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      return totalSyncedBytes;<a name="line.219"></a>
+<span class="sourceLineNo">218</span>    public long getSyncWaitMs() {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return syncWaitMs;<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>    public long getSyncedEntries() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return syncedEntries;<a name="line.223"></a>
+<span class="sourceLineNo">222</span>    public long getTotalSyncedBytes() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return totalSyncedBytes;<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>    public float getSyncedPerSec() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return syncedPerSec;<a name="line.227"></a>
+<span class="sourceLineNo">226</span>    public long getSyncedEntries() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return syncedEntries;<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this(conf,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        leaseRecovery);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @VisibleForTesting<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    this.conf = conf;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.leaseRecovery = leaseRecovery;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.walDir = walDir;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.walArchiveDir = walArchiveDir;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    this.fs = walDir.getFileSystem(conf);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Create the log directory for the procedure store<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (!fs.exists(walDir)) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      if (!fs.mkdirs(walDir)) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Now that it exists, set the log policy<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    String storagePolicy =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>
-<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public void start(int numSlots) throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    if (!setRunning(true)) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // Init buffer slots<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    loading.set(true);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    runningProcCount = numSlots;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    syncMaxSlot = numSlots;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    slots = new ByteSlot[numSlots];<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      slotsCache.offer(new ByteSlot());<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>    // Tunings<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    walCountWarnThreshold =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    maxRetriesBeforeRoll =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // WebUI<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.301"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    public float getSyncedPerSec() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return syncedPerSec;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this(conf,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        leaseRecovery);<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>  @VisibleForTesting<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    this.conf = conf;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    this.leaseRecovery = leaseRecovery;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.walDir = walDir;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.walArchiveDir = walArchiveDir;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.fs = walDir.getFileSystem(conf);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Create the log directory for the procedure store<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (!fs.exists(walDir)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (!fs.mkdirs(walDir)) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Unable to mkdir " + walDir);<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>    // Now that it exists, set the log policy<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    String storagePolicy =<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      } else {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>  }<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void start(int numSlots) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    if (!setRunning(true)) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      return;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Init buffer slots<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    loading.set(true);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    runningProcCount = numSlots;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    syncMaxSlot = numSlots;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    slots = new ByteSlot[numSlots];<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      slotsCache.offer(new ByteSlot());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // Tunings<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    walCountWarnThreshold =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    maxRetriesBeforeRoll =<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.301"></a>
 <span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // Init sync thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      @Override<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      public void run() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          syncLoop();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        } catch (Throwable e) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          if (!isSyncAborted()) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            sendAbortProcessSignal();<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>    };<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    syncThread.start();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(final boolean abort) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!setRunning(false)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    sendStopSignal();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (!isSyncAborted()) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        while (syncThread.isAlive()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          sendStopSignal();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          syncThread.join(250);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      } catch (InterruptedException e) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        LOG.warn("join interrupted", e);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        Thread.currentThread().interrupt();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Close the writer<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    closeCurrentLogStream();<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Close the old logs<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    // they should be already closed, this is just in case the load fails<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // and we call start() and then stop()<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (ProcedureWALFile log: logs) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      log.close();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    logs.clear();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    loading.set(true);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void sendStopSignal() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (lock.tryLock()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      try {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        waitCond.signalAll();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        syncCond.signalAll();<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      } finally {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        lock.unlock();<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>  }<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>  public int getNumThreads() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    return slots == null ? 0 : slots.length;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Override<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public int setRunningProcedureCount(final int count) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return this.runningProcCount;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return storeTracker;<a name="line.377"></a>
+<span class="sourceLineNo">303</span>    // WebUI<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Init sync thread<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      public void run() {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          syncLoop();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        } catch (Throwable e) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if (!isSyncAborted()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            sendAbortProcessSignal();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          }<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    };<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    syncThread.start();<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void stop(final boolean abort) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (!setRunning(false)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    sendStopSignal();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (!isSyncAborted()) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        while (syncThread.isAlive()) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          sendStopSignal();<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          syncThread.join(250);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      } catch (InterruptedException e) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        LOG.warn("join interrupted", e);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Close the writer<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    closeCurrentLogStream();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Close the old logs<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // they should be already closed, this is just in case the load fails<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // and we call start() and then stop()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    for (ProcedureWALFile log: logs) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      log.close();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    logs.clear();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    loading.set(true);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private void sendStopSignal() {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    if (lock.tryLock()) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        waitCond.signalAll();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        syncCond.signalAll();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      } finally {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        lock.unlock();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public int getNumThreads() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return slots == null ? 0 : slots.length;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  @Override<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public int setRunningProcedureCount(final int count) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    return this.runningProcCount;<a name="line.377"></a>
 <span class="sourceLineNo">378</span>  }<a name="line.378"></a>
 <span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    lock.lock();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    try {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new ArrayList&lt;&gt;(logs);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    } finally {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      lock.unlock();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return corruptedLogs;<a name="line.390"></a>
+<span class="sourceLineNo">380</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    return storeTracker;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    lock.lock();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new ArrayList&lt;&gt;(logs);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } finally {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      lock.unlock();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
 <span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public void recoverLease() throws IOException {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    lock.lock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      boolean afterFirstAttempt = false;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      while (isRunning()) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        // Don't sleep before first attempt<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (afterFirstAttempt) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              waitBeforeRoll);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        } else {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          afterFirstAttempt = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        // Get Log-MaxID and recover lease on old logs<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          flushLogId = initOldLogs(oldLogs);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        } catch (FileNotFoundException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          continue;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Create new state-log<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          // someone else has already created this log<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          continue;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // We have the lease on the log<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        oldLogs = getLogFiles();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      lock.unlock();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    lock.lock();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    try {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      if (logs.isEmpty()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // Nothing to do, If we have only the current log.<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (logs.size() == 1) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        LOG.trace("No state logs to replay.");<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        loader.setMaxProcId(0);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        return;<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>      // Load the old logs<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      it.next(); // Skip the current log<a name="line.457"></a>
+<span class="sourceLineNo">393</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    return corruptedLogs;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public void recoverLease() throws IOException {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    lock.lock();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    try {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      boolean afterFirstAttempt = false;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      while (isRunning()) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // Don't sleep before first attempt<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (afterFirstAttempt) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.406"></a>
+<span class="sourceLineNo">407</span>              waitBeforeRoll);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          afterFirstAttempt = true;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        // Get Log-MaxID and recover lease on old logs<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          flushLogId = initOldLogs(oldLogs);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (FileNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          continue;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // Create new state-log<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          // someone else has already created this log<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // We have the lease on the log<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        oldLogs = getLogFiles();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        break;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    } finally {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      lock.unlock();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    lock.lock();<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (logs.isEmpty()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        throw new RuntimeException("recoverLease() must be called before loading data");<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>      // Nothing to do, If we have only the current log.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (logs.size() == 1) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        LOG.trace("No state logs to replay.");<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        loader.setMaxProcId(0);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>        @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        public void setMaxProcId(long maxProcId) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          loader.load(procIter);<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>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          loader.handleCorrupted(procIter);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>        @Override<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          if (corruptedLogs == null) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          corruptedLogs.add(log);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // TODO: sideline corrupted log<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      });<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    } finally {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      try {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // try to cleanup inactive wals and complete the operation<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        buildHoldingCleanupTracker();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        tryCleanupLogsOnLoad();<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        loading.set(false);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      } finally {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        lock.unlock();<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>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  private void tryCleanupLogsOnLoad() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // nothing to cleanup.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (logs.size() &lt;= 1) return;<a name="line.499"></a>
+<span class="sourceLineNo">459</span>      // Load the old logs<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      it.next(); // Skip the current log<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        @Override<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        public void setMaxProcId(long maxProcId) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          loader.load(procIter);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>        @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          loader.handleCorrupted(procIter);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>        @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          if (corruptedLogs == null) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>          corruptedLogs.add(log);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          // TODO: sideline corrupted log<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      });<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    } finally {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      try {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        // try to cleanup inactive wals and complete the operation<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        buildHoldingCleanupTracker();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        tryCleanupLogsOnLoad();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        loading.set(false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      } finally {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        lock.unlock();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
 <span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    // the config says to not cleanup wals on load.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return;<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>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      periodicRoll();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    } catch (IOException e) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.511"></a>
+<span class="sourceLineNo">501</span>  private void tryCleanupLogsOnLoad() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    // nothing to cleanup.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (logs.size() &lt;= 1) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return;<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>    // the config says to not cleanup 

<TRUNCATED>

[02/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html
index 2edbb7d..5348cd0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.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};
+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";
@@ -170,54 +170,36 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <th class="colLast" scope="col">Method and Description</th>
 </tr>
 <tr id="i0" class="altColor">
-<td class="colFirst"><code>(package private) org.apache.hadoop.hbase.procedure2.store.BitSetNode</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#buildBitSetNode-long:A-long:A-long:A-">buildBitSetNode</a></span>(long[]&nbsp;active,
-               long[]&nbsp;updated,
-               long[]&nbsp;deleted)</code>&nbsp;</td>
-</tr>
-<tr id="i1" class="rowColor">
-<td class="colFirst"><code>(package private) org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#buildTracker-long:A-long:A-long:A-">buildTracker</a></span>(long[]&nbsp;active,
-            long[]&nbsp;updated,
-            long[]&nbsp;deleted)</code>&nbsp;</td>
-</tr>
-<tr id="i2" class="altColor">
-<td class="colFirst"><code>(package private) boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#isDeleted-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">isDeleted</a></span>(org.apache.hadoop.hbase.procedure2.store.BitSetNode&nbsp;n,
-         long&nbsp;procId)</code>&nbsp;</td>
-</tr>
-<tr id="i3" class="rowColor">
-<td class="colFirst"><code>(package private) boolean</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#isDeleted-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-long-">isDeleted</a></span>(org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker&nbsp;n,
-         long&nbsp;procId)</code>&nbsp;</td>
-</tr>
-<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testBasicCRUD--">testBasicCRUD</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testDelete--">testDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testGetActiveProcIds--">testGetActiveProcIds</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testLoad--">testLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testPartialTracker--">testPartialTracker</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testRandLoad--">testRandLoad</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testSeqInsertAndDelete--">testSeqInsertAndDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testSetDeletedIfSet--">testSetDeletedIfSet</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#testSetDeletedIfModified--">testSetDeletedIfModified</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
 <ul class="blockList">
@@ -338,65 +320,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.195">testDelete</a>()</pre>
 </li>
 </ul>
-<a name="isDeleted-org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker-long-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>isDeleted</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.220">isDeleted</a>(org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker&nbsp;n,
-                  long&nbsp;procId)</pre>
-</li>
-</ul>
-<a name="isDeleted-org.apache.hadoop.hbase.procedure2.store.BitSetNode-long-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>isDeleted</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.224">isDeleted</a>(org.apache.hadoop.hbase.procedure2.store.BitSetNode&nbsp;n,
-                  long&nbsp;procId)</pre>
-</li>
-</ul>
-<a name="buildTracker-long:A-long:A-long:A-">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>buildTracker</h4>
-<pre>org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.232">buildTracker</a>(long[]&nbsp;active,
-                                                                            long[]&nbsp;updated,
-                                                                            long[]&nbsp;deleted)</pre>
-<dl>
-<dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>active</code> - list of active proc ids. To mark them as non-deleted, since by default a proc
-               id is always marked deleted.</dd>
-</dl>
-</li>
-</ul>
-<a name="buildBitSetNode-long:A-long:A-long:A-">
+<a name="testSetDeletedIfModified--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>buildBitSetNode</h4>
-<pre>org.apache.hadoop.hbase.procedure2.store.BitSetNode&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.251">buildBitSetNode</a>(long[]&nbsp;active,
-                                                                    long[]&nbsp;updated,
-                                                                    long[]&nbsp;deleted)</pre>
-<dl>
-<dt><span class="paramLabel">Parameters:</span></dt>
-<dd><code>active</code> - list of active proc ids. To mark them as non-deleted, since by default a proc
-               id is always marked deleted.</dd>
-</dl>
+<h4>testSetDeletedIfModified</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.221">testSetDeletedIfModified</a>()</pre>
 </li>
 </ul>
-<a name="testSetDeletedIfSet--">
+<a name="testGetActiveProcIds--">
 <!--   -->
 </a>
 <ul class="blockListLast">
 <li class="blockList">
-<h4>testSetDeletedIfSet</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.267">testSetDeletedIfSet</a>()</pre>
+<h4>testGetActiveProcIds</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/TestProcedureStoreTracker.html#line.250">testGetActiveProcIds</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
index d65b315..f28299f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html
@@ -219,7 +219,7 @@ extends org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore</pre>
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase</h3>
-<code>isRunning, registerListener, sendAbortProcessSignal, sendPostSyncSignal, setRunning, unregisterListener</code></li>
+<code>isRunning, registerListener, sendAbortProcessSignal, sendForceUpdateSignal, sendPostSyncSignal, setRunning, unregisterListener</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html
index bb21f3a..11ee6e0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html
@@ -50,7 +50,7 @@ var activeTableTab = "activeTableTab";
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html" target="_top">Frames</a></li>
@@ -282,7 +282,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurre
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.NoSyncWalProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestStressWALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/ProcedureWALPerformanceEvaluation.Worker.html" target="_top">Frames</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html
new file mode 100644
index 0000000..4212453
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html
@@ -0,0 +1,412 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestForceUpdateProcedure.ExchangeProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestForceUpdateProcedure.ExchangeProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.ExchangeProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.ExchangeProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.procedure2.store.wal</div>
+<h2 title="Class TestForceUpdateProcedure.ExchangeProcedure" class="title">Class TestForceUpdateProcedure.ExchangeProcedure</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.store.wal.TestForceUpdateProcedure.ExchangeProcedure</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><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;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public static final class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#line.148">TestForceUpdateProcedure.ExchangeProcedure</a>
+extends org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>org.apache.hadoop.hbase.procedure2.Procedure.LockState</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>NO_PROC_ID, NO_TIMEOUT</code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#ExchangeProcedure--">ExchangeProcedure</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#abort-java.lang.Void-">abort</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#execute-java.lang.Void-">execute</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</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/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#rollback-java.lang.Void-">rollback</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<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/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>acquireLock, addStackIndex, afterReplay, beforeReplay, compareTo, completionCleanup, doExecute, doRollback, elapsedTime, getChildrenLatch, getException, getLastUpdate, getNonceKey, getOwner, getParentProcId, getProcedureMetrics, getProcId, getProcIdHashCode, getProcName, getResult, getRootProcedureId, getRootProcId, getStackIndexes, getState, getSubmittedTime, getTimeout, getTimeoutTimestamp, hasChildren, hasException, hasLock, hasOwner, hasParent, hasTimeout, haveSameParent, holdLock, incChildrenLatch, isBypass, isFailed, isFinished, isInitializing, isRunnable, isSuccess, isWaiting, isYieldAfterExecutionStep, releaseLock, removeStackIndex, setAbortFailure, setChildrenLatch, setFailure, setFailure, setLastUpdate, setNonceKey, setOwner, setOwner, setParentProcId, setProcId, setResult, setRootProcId, setStackIndexes, setState, setSubmittedTime, setTimeout, setTimeoutFailure, shouldWaitClientAck, skipPersistence, toString, toStringClass, toStringClassDetails, toStringDetails, toS
 tringSimpleSB, toStringState, updateMetricsOnFinish, updateMetricsOnSubmit, updateTimestamp, waitInitialized, wasExecuted</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="ExchangeProcedure--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>ExchangeProcedure</h4>
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.148">ExchangeProcedure</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="execute-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>execute</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.152">execute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)
+                                                                throws org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                                                                       org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                                                                       <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="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>execute</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="rollback-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rollback</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.162">rollback</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>rollback</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="abort-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>abort</h4>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.167">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>abort</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+</dl>
+</li>
+</ul>
+<a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>serializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.172">serializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>serializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>deserializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html#line.176">deserializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>deserializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.ExchangeProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.ExchangeProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html
new file mode 100644
index 0000000..6ba429c
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html
@@ -0,0 +1,412 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!-- NewPage -->
+<html lang="en">
+<head>
+<!-- Generated by javadoc -->
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>TestForceUpdateProcedure.ParentProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../../stylesheet.css" title="Style">
+<script type="text/javascript" src="../../../../../../../script.js"></script>
+</head>
+<body>
+<script type="text/javascript"><!--
+    try {
+        if (location.href.indexOf('is-external=true') == -1) {
+            parent.document.title="TestForceUpdateProcedure.ParentProcedure (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10};
+var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
+var altColor = "altColor";
+var rowColor = "rowColor";
+var tableTab = "tableTab";
+var activeTableTab = "activeTableTab";
+</script>
+<noscript>
+<div>JavaScript is disabled on your browser.</div>
+</noscript>
+<!-- ========= START OF TOP NAVBAR ======= -->
+<div class="topNav"><a name="navbar.top">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.top.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.ParentProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.ParentProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_top">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_top");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.top">
+<!--   -->
+</a></div>
+<!-- ========= END OF TOP NAVBAR ========= -->
+<!-- ======== START OF CLASS DATA ======== -->
+<div class="header">
+<div class="subTitle">org.apache.hadoop.hbase.procedure2.store.wal</div>
+<h2 title="Class TestForceUpdateProcedure.ParentProcedure" class="title">Class TestForceUpdateProcedure.ParentProcedure</h2>
+</div>
+<div class="contentContainer">
+<ul class="inheritance">
+<li><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">java.lang.Object</a></li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</li>
+<li>
+<ul class="inheritance">
+<li>org.apache.hadoop.hbase.procedure2.store.wal.TestForceUpdateProcedure.ParentProcedure</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd><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;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;&gt;</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">TestForceUpdateProcedure</a></dd>
+</dl>
+<hr>
+<br>
+<pre>public static final class <a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.html#line.120">TestForceUpdateProcedure.ParentProcedure</a>
+extends org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>org.apache.hadoop.hbase.procedure2.Procedure.LockState</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== FIELD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="field.summary">
+<!--   -->
+</a>
+<h3>Field Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>NO_PROC_ID, NO_TIMEOUT</code></li>
+</ul>
+</li>
+</ul>
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.summary">
+<!--   -->
+</a>
+<h3>Constructor Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Constructor Summary table, listing constructors, and an explanation">
+<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#ParentProcedure--">ParentProcedure</a></span>()</code>&nbsp;</td>
+</tr>
+</table>
+</li>
+</ul>
+<!-- ========== METHOD SUMMARY =========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.summary">
+<!--   -->
+</a>
+<h3>Method Summary</h3>
+<table class="memberSummary" border="0" cellpadding="3" cellspacing="0" summary="Method Summary table, listing methods, and an explanation">
+<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th class="colLast" scope="col">Method and Description</th>
+</tr>
+<tr id="i0" class="altColor">
+<td class="colFirst"><code>protected boolean</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#abort-java.lang.Void-">abort</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<tr id="i1" class="rowColor">
+<td class="colFirst"><code>protected void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">deserializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+<tr id="i2" class="altColor">
+<td class="colFirst"><code>protected org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#execute-java.lang.Void-">execute</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</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/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#rollback-java.lang.Void-">rollback</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</code>&nbsp;</td>
+</tr>
+<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/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">serializeStateData</a></span>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&nbsp;serializer)</code>&nbsp;</td>
+</tr>
+</table>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.procedure2.Procedure</h3>
+<code>acquireLock, addStackIndex, afterReplay, beforeReplay, compareTo, completionCleanup, doExecute, doRollback, elapsedTime, getChildrenLatch, getException, getLastUpdate, getNonceKey, getOwner, getParentProcId, getProcedureMetrics, getProcId, getProcIdHashCode, getProcName, getResult, getRootProcedureId, getRootProcId, getStackIndexes, getState, getSubmittedTime, getTimeout, getTimeoutTimestamp, hasChildren, hasException, hasLock, hasOwner, hasParent, hasTimeout, haveSameParent, holdLock, incChildrenLatch, isBypass, isFailed, isFinished, isInitializing, isRunnable, isSuccess, isWaiting, isYieldAfterExecutionStep, releaseLock, removeStackIndex, setAbortFailure, setChildrenLatch, setFailure, setFailure, setLastUpdate, setNonceKey, setOwner, setOwner, setParentProcId, setProcId, setResult, setRootProcId, setStackIndexes, setState, setSubmittedTime, setTimeout, setTimeoutFailure, shouldWaitClientAck, skipPersistence, toString, toStringClass, toStringClassDetails, toStringDetails, toS
 tringSimpleSB, toStringState, updateMetricsOnFinish, updateMetricsOnSubmit, updateTimestamp, waitInitialized, wasExecuted</code></li>
+</ul>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
+<!--   -->
+</a>
+<h3>Methods inherited from class&nbsp;java.lang.<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></h3>
+<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#clone--" title="class or interface in java.lang">clone</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#equals-java.lang.Object-" title="class or interface in java.lang">equals</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#finalize--" title="class or interface in java.lang">finalize</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#getClass--" title="class or interface in java.lang">getClass</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#hashCode--" title="class or interface in java.lang">hashCode</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#notify--" title="class or interface in java.lang">notify</a>, <a href="https://docs.oracle.com/javase/8/docs/api/ja
 va/lang/Object.html?is-external=true#notifyAll--" title="class or interface in java.lang">notifyAll</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait--" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-" title="class or interface in java.lang">wait</a>, <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-" title="class or interface in java.lang">wait</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="details">
+<ul class="blockList">
+<li class="blockList">
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="constructor.detail">
+<!--   -->
+</a>
+<h3>Constructor Detail</h3>
+<a name="ParentProcedure--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>ParentProcedure</h4>
+<pre>public&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.120">ParentProcedure</a>()</pre>
+</li>
+</ul>
+</li>
+</ul>
+<!-- ============ METHOD DETAIL ========== -->
+<ul class="blockList">
+<li class="blockList"><a name="method.detail">
+<!--   -->
+</a>
+<h3>Method Detail</h3>
+<a name="execute-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>execute</h4>
+<pre>protected&nbsp;org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;[]&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.124">execute</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)
+                                                                throws org.apache.hadoop.hbase.procedure2.ProcedureYieldException,
+                                                                       org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException,
+                                                                       <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="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>execute</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureYieldException</code></dd>
+<dd><code>org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException</code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="rollback-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>rollback</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.130">rollback</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>rollback</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+<dd><code><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></code></dd>
+</dl>
+</li>
+</ul>
+<a name="abort-java.lang.Void-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>abort</h4>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.135">abort</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&nbsp;env)</pre>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>abort</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+</dl>
+</li>
+</ul>
+<a name="serializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>serializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.140">serializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>serializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+<a name="deserializeStateData-org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>deserializeStateData</h4>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html#line.144">deserializeStateData</a>(org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer&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>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code>deserializeStateData</code>&nbsp;in class&nbsp;<code>org.apache.hadoop.hbase.procedure2.Procedure&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Void.html?is-external=true" title="class or interface in java.lang">Void</a>&gt;</code></dd>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></code></dd>
+</dl>
+</li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+</div>
+<!-- ========= END OF CLASS DATA ========= -->
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<div class="bottomNav"><a name="navbar.bottom">
+<!--   -->
+</a>
+<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
+<a name="navbar.bottom.firstrow">
+<!--   -->
+</a>
+<ul class="navList" title="Navigation">
+<li><a href="../../../../../../../overview-summary.html">Overview</a></li>
+<li><a href="package-summary.html">Package</a></li>
+<li class="navBarCell1Rev">Class</li>
+<li><a href="class-use/TestForceUpdateProcedure.ParentProcedure.html">Use</a></li>
+<li><a href="package-tree.html">Tree</a></li>
+<li><a href="../../../../../../../deprecated-list.html">Deprecated</a></li>
+<li><a href="../../../../../../../index-all.html">Index</a></li>
+<li><a href="../../../../../../../help-doc.html">Help</a></li>
+</ul>
+</div>
+<div class="subNav">
+<ul class="navList">
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ExchangeProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.WaitingProcedure.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../../../index.html?org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.ParentProcedure.html" target="_top">Frames</a></li>
+<li><a href="TestForceUpdateProcedure.ParentProcedure.html" target="_top">No&nbsp;Frames</a></li>
+</ul>
+<ul class="navList" id="allclasses_navbar_bottom">
+<li><a href="../../../../../../../allclasses-noframe.html">All&nbsp;Classes</a></li>
+</ul>
+<div>
+<script type="text/javascript"><!--
+  allClassesLink = document.getElementById("allclasses_navbar_bottom");
+  if(window==top) {
+    allClassesLink.style.display = "block";
+  }
+  else {
+    allClassesLink.style.display = "none";
+  }
+  //-->
+</script>
+</div>
+<div>
+<ul class="subNavList">
+<li>Summary:&nbsp;</li>
+<li><a href="#nested.classes.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">Nested</a>&nbsp;|&nbsp;</li>
+<li><a href="#fields.inherited.from.class.org.apache.hadoop.hbase.procedure2.Procedure">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="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
+<li><a href="#method.detail">Method</a></li>
+</ul>
+</div>
+<a name="skip.navbar.bottom">
+<!--   -->
+</a></div>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+<p class="legalCopy"><small>Copyright &#169; 2007&#x2013;2018 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>


[09/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html
index f9d05cb..67f0fc6 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html
@@ -31,316 +31,325 @@
 <span class="sourceLineNo">023</span>import java.lang.reflect.Constructor;<a name="line.23"></a>
 <span class="sourceLineNo">024</span>import java.lang.reflect.InvocationTargetException;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import java.util.List;<a name="line.25"></a>
-<span class="sourceLineNo">026</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.hbase.CoordinatedStateManager;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> */<a name="line.37"></a>
-<span class="sourceLineNo">038</span>@InterfaceAudience.Private<a name="line.38"></a>
-<span class="sourceLineNo">039</span>public class JVMClusterUtil {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  public static class RegionServerThread extends Thread {<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    private final HRegionServer regionServer;<a name="line.46"></a>
-<span class="sourceLineNo">047</span><a name="line.47"></a>
-<span class="sourceLineNo">048</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.49"></a>
-<span class="sourceLineNo">050</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    public HRegionServer getRegionServer() {<a name="line.54"></a>
-<span class="sourceLineNo">055</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.59"></a>
-<span class="sourceLineNo">060</span>     * to be used.<a name="line.60"></a>
-<span class="sourceLineNo">061</span>     */<a name="line.61"></a>
-<span class="sourceLineNo">062</span>    public void waitForServerOnline() {<a name="line.62"></a>
-<span class="sourceLineNo">063</span>      // The server is marked online after the init method completes inside of<a name="line.63"></a>
-<span class="sourceLineNo">064</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.64"></a>
-<span class="sourceLineNo">065</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.65"></a>
-<span class="sourceLineNo">066</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.66"></a>
-<span class="sourceLineNo">067</span>      regionServer.waitForServerOnline();<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    }<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>  /**<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * Creates a {@link RegionServerThread}.<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * Call 'start' on the returned thread to make it run.<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * @param c Configuration to use.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   * @param hrsc Class to create.<a name="line.75"></a>
-<span class="sourceLineNo">076</span>   * @param index Used distinguishing the object returned.<a name="line.76"></a>
-<span class="sourceLineNo">077</span>   * @throws IOException<a name="line.77"></a>
-<span class="sourceLineNo">078</span>   * @return Region server added.<a name="line.78"></a>
-<span class="sourceLineNo">079</span>   */<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.80"></a>
-<span class="sourceLineNo">081</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    HRegionServer server;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    try {<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      ctor.setAccessible(true);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>      server = ctor.newInstance(c);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    } catch (InvocationTargetException ite) {<a name="line.87"></a>
-<span class="sourceLineNo">088</span>      Throwable target = ite.getTargetException();<a name="line.88"></a>
-<span class="sourceLineNo">089</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.89"></a>
-<span class="sourceLineNo">090</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.90"></a>
-<span class="sourceLineNo">091</span>          target.getCause().getMessage(): ""), target);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>    } catch (Exception e) {<a name="line.92"></a>
-<span class="sourceLineNo">093</span>      IOException ioe = new IOException();<a name="line.93"></a>
-<span class="sourceLineNo">094</span>      ioe.initCause(e);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>      throw ioe;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    }<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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">026</span>import java.util.concurrent.TimeUnit;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.function.Supplier;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><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>import org.apache.hadoop.conf.Configuration;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.33"></a>
+<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<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> * Utility used running a cluster all in the one JVM.<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 JVMClusterUtil {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final Logger LOG = LoggerFactory.getLogger(JVMClusterUtil.class);<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>   * Datastructure to hold RegionServer Thread and RegionServer instance<a name="line.44"></a>
+<span class="sourceLineNo">045</span>   */<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  public static class RegionServerThread extends Thread {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    private final HRegionServer regionServer;<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>    public RegionServerThread(final HRegionServer r, final int index) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      super(r, "RS:" + index + ";" + r.getServerName().toShortString());<a name="line.50"></a>
+<span class="sourceLineNo">051</span>      this.regionServer = r;<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>    /** @return the region server */<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    public HRegionServer getRegionServer() {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>      return this.regionServer;<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>     * Block until the region server has come online, indicating it is ready<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * to be used.<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    public void waitForServerOnline() {<a name="line.63"></a>
+<span class="sourceLineNo">064</span>      // The server is marked online after the init method completes inside of<a name="line.64"></a>
+<span class="sourceLineNo">065</span>      // the HRS#run method.  HRS#init can fail for whatever region.  In those<a name="line.65"></a>
+<span class="sourceLineNo">066</span>      // cases, we'll jump out of the run without setting online flag.  Check<a name="line.66"></a>
+<span class="sourceLineNo">067</span>      // stopRequested so we don't wait here a flag that will never be flipped.<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      regionServer.waitForServerOnline();<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><a name="line.71"></a>
+<span class="sourceLineNo">072</span>  /**<a name="line.72"></a>
+<span class="sourceLineNo">073</span>   * Creates a {@link RegionServerThread}.<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Call 'start' on the returned thread to make it run.<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param c Configuration to use.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @param hrsc Class to create.<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   * @param index Used distinguishing the object returned.<a name="line.77"></a>
+<span class="sourceLineNo">078</span>   * @throws IOException<a name="line.78"></a>
+<span class="sourceLineNo">079</span>   * @return Region server added.<a name="line.79"></a>
+<span class="sourceLineNo">080</span>   */<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  public static JVMClusterUtil.RegionServerThread createRegionServerThread(final Configuration c,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      final Class&lt;? extends HRegionServer&gt; hrsc, final int index) throws IOException {<a name="line.82"></a>
+<span class="sourceLineNo">083</span>    HRegionServer server;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    try {<a name="line.84"></a>
+<span class="sourceLineNo">085</span>      Constructor&lt;? extends HRegionServer&gt; ctor = hrsc.getConstructor(Configuration.class);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>      ctor.setAccessible(true);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      server = ctor.newInstance(c);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    } catch (InvocationTargetException ite) {<a name="line.88"></a>
+<span class="sourceLineNo">089</span>      Throwable target = ite.getTargetException();<a name="line.89"></a>
+<span class="sourceLineNo">090</span>      throw new RuntimeException("Failed construction of RegionServer: " +<a name="line.90"></a>
+<span class="sourceLineNo">091</span>        hrsc.toString() + ((target.getCause() != null)?<a name="line.91"></a>
+<span class="sourceLineNo">092</span>          target.getCause().getMessage(): ""), target);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    } catch (Exception e) {<a name="line.93"></a>
+<span class="sourceLineNo">094</span>      IOException ioe = new IOException();<a name="line.94"></a>
+<span class="sourceLineNo">095</span>      ioe.initCause(e);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>      throw ioe;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>    }<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    return new JVMClusterUtil.RegionServerThread(server, index);<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>  /**<a name="line.101"></a>
-<span class="sourceLineNo">102</span>   * Datastructure to hold Master Thread and Master instance<a name="line.102"></a>
-<span class="sourceLineNo">103</span>   */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public static class MasterThread extends Thread {<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    private final HMaster master;<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>    public MasterThread(final HMaster m, final int index) {<a name="line.107"></a>
-<span class="sourceLineNo">108</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.108"></a>
-<span class="sourceLineNo">109</span>      this.master = m;<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>    /** @return the master */<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    public HMaster getMaster() {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>      return this.master;<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><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  /**<a name="line.118"></a>
-<span class="sourceLineNo">119</span>   * Creates a {@link MasterThread}.<a name="line.119"></a>
-<span class="sourceLineNo">120</span>   * Call 'start' on the returned thread to make it run.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param c Configuration to use.<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @param hmc Class to create.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   * @param index Used distinguishing the object returned.<a name="line.123"></a>
-<span class="sourceLineNo">124</span>   * @throws IOException<a name="line.124"></a>
-<span class="sourceLineNo">125</span>   * @return Master added.<a name="line.125"></a>
-<span class="sourceLineNo">126</span>   */<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    HMaster server;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    try {<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    } catch (InvocationTargetException ite) {<a name="line.132"></a>
-<span class="sourceLineNo">133</span>      Throwable target = ite.getTargetException();<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.134"></a>
-<span class="sourceLineNo">135</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.135"></a>
-<span class="sourceLineNo">136</span>          target.getCause().getMessage(): ""), target);<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    } catch (Exception e) {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>      IOException ioe = new IOException();<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      ioe.initCause(e);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      throw ioe;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    }<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.147"></a>
-<span class="sourceLineNo">148</span>      if (t.master.isActiveMaster()) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>        return t;<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>    return null;<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>  /**<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.157"></a>
-<span class="sourceLineNo">158</span>   * and returns its address.<a name="line.158"></a>
-<span class="sourceLineNo">159</span>   * @param masters<a name="line.159"></a>
-<span class="sourceLineNo">160</span>   * @param regionservers<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * @return Address to use contacting primary master.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   */<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>    Configuration configuration = null;<a name="line.166"></a>
-<span class="sourceLineNo">167</span><a name="line.167"></a>
-<span class="sourceLineNo">168</span>    if (masters == null || masters.isEmpty()) {<a name="line.168"></a>
-<span class="sourceLineNo">169</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      configuration = t.getMaster().getConfiguration();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      t.start();<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    // Wait for an active master<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    //  having an active master before starting the region threads allows<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    //  then to succeed on their connection to master<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    long startTime = System.currentTimeMillis();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    while (findActiveMaster(masters) == null) {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      try {<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        Thread.sleep(100);<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      } catch (InterruptedException e) {<a name="line.184"></a>
-<span class="sourceLineNo">185</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      }<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      int startTimeout = configuration != null ? Integer.parseInt(<a name="line.187"></a>
-<span class="sourceLineNo">188</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      if (System.currentTimeMillis() &gt; startTime + startTimeout) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>        String msg = "Master not active after " + startTimeout + "ms";<a name="line.190"></a>
-<span class="sourceLineNo">191</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.191"></a>
-<span class="sourceLineNo">192</span>        throw new RuntimeException(msg);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      }<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    }<a name="line.194"></a>
-<span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>    if (regionservers != null) {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.197"></a>
-<span class="sourceLineNo">198</span>        t.start();<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      }<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    }<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>    // Wait for an active master to be initialized (implies being master)<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    //  with this, when we return the cluster is complete<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    startTime = System.currentTimeMillis();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    final int maxwait = 200000;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    while (true) {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      if (t != null &amp;&amp; t.master.isInitialized()) {<a name="line.208"></a>
-<span class="sourceLineNo">209</span>        return t.master.getServerName().toString();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      }<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      // REMOVE<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      if (System.currentTimeMillis() &gt; startTime + 10000) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>        try {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>          Thread.sleep(1000);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        } catch (InterruptedException e) {<a name="line.215"></a>
-<span class="sourceLineNo">216</span>          throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.216"></a>
-<span class="sourceLineNo">217</span>        }<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      }<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      if (System.currentTimeMillis() &gt; startTime + maxwait) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>        String msg = "Master not initialized after " + maxwait + "ms seconds";<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.221"></a>
-<span class="sourceLineNo">222</span>        throw new RuntimeException(msg);<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      }<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      try {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        Thread.sleep(100);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      } catch (InterruptedException e) {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<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>  }<a name="line.230"></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>   * Datastructure to hold Master Thread and Master instance<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  public static class MasterThread extends Thread {<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    private final HMaster master;<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>    public MasterThread(final HMaster m, final int index) {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>      super(m, "M:" + index + ";" + m.getServerName().toShortString());<a name="line.109"></a>
+<span class="sourceLineNo">110</span>      this.master = m;<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>    /** @return the master */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    public HMaster getMaster() {<a name="line.114"></a>
+<span class="sourceLineNo">115</span>      return this.master;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    }<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  }<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>  /**<a name="line.119"></a>
+<span class="sourceLineNo">120</span>   * Creates a {@link MasterThread}.<a name="line.120"></a>
+<span class="sourceLineNo">121</span>   * Call 'start' on the returned thread to make it run.<a name="line.121"></a>
+<span class="sourceLineNo">122</span>   * @param c Configuration to use.<a name="line.122"></a>
+<span class="sourceLineNo">123</span>   * @param hmc Class to create.<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * @param index Used distinguishing the object returned.<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @throws IOException<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * @return Master added.<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  public static JVMClusterUtil.MasterThread createMasterThread(final Configuration c,<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      final Class&lt;? extends HMaster&gt; hmc, final int index) throws IOException {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    HMaster server;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    try {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      server = hmc.getConstructor(Configuration.class).newInstance(c);<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    } catch (InvocationTargetException ite) {<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      Throwable target = ite.getTargetException();<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      throw new RuntimeException("Failed construction of Master: " +<a name="line.135"></a>
+<span class="sourceLineNo">136</span>        hmc.toString() + ((target.getCause() != null)?<a name="line.136"></a>
+<span class="sourceLineNo">137</span>          target.getCause().getMessage(): ""), target);<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    } catch (Exception e) {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      IOException ioe = new IOException();<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      ioe.initCause(e);<a name="line.140"></a>
+<span class="sourceLineNo">141</span>      throw ioe;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    }<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    return new JVMClusterUtil.MasterThread(server, index);<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>  private static JVMClusterUtil.MasterThread findActiveMaster(<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    List&lt;JVMClusterUtil.MasterThread&gt; masters) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>      if (t.master.isActiveMaster()) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>        return t;<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><a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return null;<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">158</span>   * Start the cluster.  Waits until there is a primary master initialized<a name="line.158"></a>
+<span class="sourceLineNo">159</span>   * and returns its address.<a name="line.159"></a>
+<span class="sourceLineNo">160</span>   * @param masters<a name="line.160"></a>
+<span class="sourceLineNo">161</span>   * @param regionservers<a name="line.161"></a>
+<span class="sourceLineNo">162</span>   * @return Address to use contacting primary master.<a name="line.162"></a>
+<span class="sourceLineNo">163</span>   */<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  public static String startup(final List&lt;JVMClusterUtil.MasterThread&gt; masters,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>      final List&lt;JVMClusterUtil.RegionServerThread&gt; regionservers) throws IOException {<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    // Implementation note: This method relies on timed sleeps in a loop. It's not great, and<a name="line.166"></a>
+<span class="sourceLineNo">167</span>    // should probably be re-written to use actual synchronization objects, but it's ok for now<a name="line.167"></a>
+<span class="sourceLineNo">168</span><a name="line.168"></a>
+<span class="sourceLineNo">169</span>    Configuration configuration = null;<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>    if (masters == null || masters.isEmpty()) {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return null;<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>    for (JVMClusterUtil.MasterThread t : masters) {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      configuration = t.getMaster().getConfiguration();<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      t.start();<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>    // Wait for an active master<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    //  having an active master before starting the region threads allows<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    //  then to succeed on their connection to master<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final int startTimeout = configuration != null ? Integer.parseInt(<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        configuration.get("hbase.master.start.timeout.localHBaseCluster", "30000")) : 30000;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    waitForEvent(startTimeout, "active", () -&gt; findActiveMaster(masters) != null);<a name="line.185"></a>
+<span class="sourceLineNo">186</span><a name="line.186"></a>
+<span class="sourceLineNo">187</span>    if (regionservers != null) {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>      for (JVMClusterUtil.RegionServerThread t: regionservers) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        t.start();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>      }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
+<span class="sourceLineNo">192</span><a name="line.192"></a>
+<span class="sourceLineNo">193</span>    // Wait for an active master to be initialized (implies being master)<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    //  with this, when we return the cluster is complete<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    final int initTimeout = configuration != null ? Integer.parseInt(<a name="line.195"></a>
+<span class="sourceLineNo">196</span>        configuration.get("hbase.master.init.timeout.localHBaseCluster", "200000")) : 200000;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    waitForEvent(initTimeout, "initialized", () -&gt; {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>        JVMClusterUtil.MasterThread t = findActiveMaster(masters);<a name="line.198"></a>
+<span class="sourceLineNo">199</span>        // master thread should never be null at this point, but let's keep the check anyway<a name="line.199"></a>
+<span class="sourceLineNo">200</span>        return t != null &amp;&amp; t.master.isInitialized();<a name="line.200"></a>
+<span class="sourceLineNo">201</span>      }<a name="line.201"></a>
+<span class="sourceLineNo">202</span>    );<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return findActiveMaster(masters).master.getServerName().toString();<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Utility method to wait some time for an event to occur, and then return control to the caller.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param millis How long to wait, in milliseconds.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * @param action The action that we are waiting for. Will be used in log message if the event<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   *               does not occur.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param check A Supplier that will be checked periodically to produce an updated true/false<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   *              result indicating if the expected event has happened or not.<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * @throws InterruptedIOException If we are interrupted while waiting for the event.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * @throws RuntimeException If we reach the specified timeout while waiting for the event.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  private static void waitForEvent(long millis, String action, Supplier&lt;Boolean&gt; check)<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      throws InterruptedIOException {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    long end = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(millis);<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>    while (true) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      if (check.get()) {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        return;<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>      if (System.nanoTime() &gt; end) {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>        String msg = "Master not " + action + " after " + millis + "ms";<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        Threads.printThreadInfo(System.out, "Thread dump because: " + msg);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        throw new RuntimeException(msg);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      }<a name="line.230"></a>
 <span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  /**<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param masters<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param regionservers<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   */<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    if (masters != null) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      // Do backups first.<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        if (!t.master.isActiveMaster()) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>          try {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>            t.master.stopMaster();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>          } catch (IOException e) {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>          }<a name="line.248"></a>
-<span class="sourceLineNo">249</span>        } else {<a name="line.249"></a>
-<span class="sourceLineNo">250</span>          activeMaster = t;<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>      // Do active after.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      if (activeMaster != null) {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        try {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>          activeMaster.master.shutdown();<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        } catch (IOException e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        }<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      }<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    boolean wasInterrupted = false;<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    if (regionservers != null) {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>      // first try nicely.<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      for (RegionServerThread t : regionservers) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
-<span class="sourceLineNo">269</span>      for (RegionServerThread t : regionservers) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>        long now = System.currentTimeMillis();<a name="line.270"></a>
-<span class="sourceLineNo">271</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>          try {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>            t.join(maxTime - now);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>          } catch (InterruptedException e) {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.275"></a>
-<span class="sourceLineNo">276</span>                "not waiting anymore on region server ends", e);<a name="line.276"></a>
-<span class="sourceLineNo">277</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>          }<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>      // Let's try to interrupt the remaining threads if any.<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        boolean atLeastOneLiveServer = false;<a name="line.284"></a>
-<span class="sourceLineNo">285</span>        for (RegionServerThread t : regionservers) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>          if (t.isAlive()) {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>            atLeastOneLiveServer = true;<a name="line.287"></a>
-<span class="sourceLineNo">288</span>            try {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.289"></a>
-<span class="sourceLineNo">290</span>              t.join(1000);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            } catch (InterruptedException e) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>              wasInterrupted = true;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            }<a name="line.293"></a>
-<span class="sourceLineNo">294</span>          }<a name="line.294"></a>
-<span class="sourceLineNo">295</span>        }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        if (!atLeastOneLiveServer) break;<a name="line.296"></a>
-<span class="sourceLineNo">297</span>        for (RegionServerThread t : regionservers) {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>          if (t.isAlive()) {<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.299"></a>
-<span class="sourceLineNo">300</span>              "if &gt; 3 attempts: i=" + i);<a name="line.300"></a>
-<span class="sourceLineNo">301</span>            if (i &gt; 3) {<a name="line.301"></a>
-<span class="sourceLineNo">302</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.302"></a>
-<span class="sourceLineNo">303</span>            }<a name="line.303"></a>
-<span class="sourceLineNo">304</span>            t.interrupt();<a name="line.304"></a>
-<span class="sourceLineNo">305</span>          }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      }<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    }<a name="line.308"></a>
-<span class="sourceLineNo">309</span><a name="line.309"></a>
-<span class="sourceLineNo">310</span>    if (masters != null) {<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>          try {<a name="line.313"></a>
-<span class="sourceLineNo">314</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.314"></a>
-<span class="sourceLineNo">315</span>            // tests.<a name="line.315"></a>
-<span class="sourceLineNo">316</span>            // this.master.join():<a name="line.316"></a>
-<span class="sourceLineNo">317</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>          } catch(InterruptedException e) {<a name="line.318"></a>
-<span class="sourceLineNo">319</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.319"></a>
-<span class="sourceLineNo">320</span>                "not waiting anymore on master ends", e);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>            wasInterrupted = true;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>          }<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        }<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      }<a name="line.324"></a>
-<span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Shutdown of " +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>    if (wasInterrupted){<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Thread.currentThread().interrupt();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>    }<a name="line.333"></a>
-<span class="sourceLineNo">334</span>  }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>}<a name="line.335"></a>
+<span class="sourceLineNo">232</span>      try {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>        Thread.sleep(100);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      } catch (InterruptedException e) {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>        throw (InterruptedIOException)new InterruptedIOException().initCause(e);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      }<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  }<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>   * @param masters<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param regionservers<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   */<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  public static void shutdown(final List&lt;MasterThread&gt; masters,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      final List&lt;RegionServerThread&gt; regionservers) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    LOG.debug("Shutting down HBase Cluster");<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (masters != null) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      // Do backups first.<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      JVMClusterUtil.MasterThread activeMaster = null;<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        if (!t.master.isActiveMaster()) {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>          try {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>            t.master.stopMaster();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>          } catch (IOException e) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>            LOG.error("Exception occurred while stopping master", e);<a name="line.256"></a>
+<span class="sourceLineNo">257</span>          }<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        } else {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>          activeMaster = t;<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        }<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      }<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      // Do active after.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      if (activeMaster != null) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>        try {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          activeMaster.master.shutdown();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        } catch (IOException e) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>          LOG.error("Exception occurred in HMaster.shutdown()", e);<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>    boolean wasInterrupted = false;<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    final long maxTime = System.currentTimeMillis() + 30 * 1000;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    if (regionservers != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      // first try nicely.<a name="line.274"></a>
+<span class="sourceLineNo">275</span>      for (RegionServerThread t : regionservers) {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>        t.getRegionServer().stop("Shutdown requested");<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      }<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      for (RegionServerThread t : regionservers) {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>        long now = System.currentTimeMillis();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>        if (t.isAlive() &amp;&amp; !wasInterrupted &amp;&amp; now &lt; maxTime) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>          try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>            t.join(maxTime - now);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          } catch (InterruptedException e) {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.284"></a>
+<span class="sourceLineNo">285</span>                "not waiting anymore on region server ends", e);<a name="line.285"></a>
+<span class="sourceLineNo">286</span>            wasInterrupted = true; // someone wants us to speed up.<a name="line.286"></a>
+<span class="sourceLineNo">287</span>          }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>      // Let's try to interrupt the remaining threads if any.<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      for (int i = 0; i &lt; 100; ++i) {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        boolean atLeastOneLiveServer = false;<a name="line.293"></a>
+<span class="sourceLineNo">294</span>        for (RegionServerThread t : regionservers) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>          if (t.isAlive()) {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>            atLeastOneLiveServer = true;<a name="line.296"></a>
+<span class="sourceLineNo">297</span>            try {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>              LOG.warn("RegionServerThreads remaining, give one more chance before interrupting");<a name="line.298"></a>
+<span class="sourceLineNo">299</span>              t.join(1000);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>            } catch (InterruptedException e) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>              wasInterrupted = true;<a name="line.301"></a>
+<span class="sourceLineNo">302</span>            }<a name="line.302"></a>
+<span class="sourceLineNo">303</span>          }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        }<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        if (!atLeastOneLiveServer) break;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        for (RegionServerThread t : regionservers) {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>          if (t.isAlive()) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>            LOG.warn("RegionServerThreads taking too long to stop, interrupting; thread dump "  +<a name="line.308"></a>
+<span class="sourceLineNo">309</span>              "if &gt; 3 attempts: i=" + i);<a name="line.309"></a>
+<span class="sourceLineNo">310</span>            if (i &gt; 3) {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>              Threads.printThreadInfo(System.out, "Thread dump " + t.getName());<a name="line.311"></a>
+<span class="sourceLineNo">312</span>            }<a name="line.312"></a>
+<span class="sourceLineNo">313</span>            t.interrupt();<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>      }<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    }<a name="line.317"></a>
+<span class="sourceLineNo">318</span><a name="line.318"></a>
+<span class="sourceLineNo">319</span>    if (masters != null) {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      for (JVMClusterUtil.MasterThread t : masters) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>        while (t.master.isAlive() &amp;&amp; !wasInterrupted) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>          try {<a name="line.322"></a>
+<span class="sourceLineNo">323</span>            // The below has been replaced to debug sometime hangs on end of<a name="line.323"></a>
+<span class="sourceLineNo">324</span>            // tests.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>            // this.master.join():<a name="line.325"></a>
+<span class="sourceLineNo">326</span>            Threads.threadDumpingIsAlive(t.master.getThread());<a name="line.326"></a>
+<span class="sourceLineNo">327</span>          } catch(InterruptedException e) {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>            LOG.info("Got InterruptedException on shutdown - " +<a name="line.328"></a>
+<span class="sourceLineNo">329</span>                "not waiting anymore on master ends", e);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>            wasInterrupted = true;<a name="line.330"></a>
+<span class="sourceLineNo">331</span>          }<a name="line.331"></a>
+<span class="sourceLineNo">332</span>        }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      }<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    }<a name="line.334"></a>
+<span class="sourceLineNo">335</span>    LOG.info("Shutdown of " +<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      ((masters != null) ? masters.size() : "0") + " master(s) and " +<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      ((regionservers != null) ? regionservers.size() : "0") +<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      " regionserver(s) " + (wasInterrupted ? "interrupted" : "complete"));<a name="line.338"></a>
+<span class="sourceLineNo">339</span><a name="line.339"></a>
+<span class="sourceLineNo">340</span>    if (wasInterrupted){<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>  }<a name="line.343"></a>
+<span class="sourceLineNo">344</span>}<a name="line.344"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/util/Random64.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/util/Random64.html b/devapidocs/src-html/org/apache/hadoop/hbase/util/Random64.html
new file mode 100644
index 0000000..ece4138
--- /dev/null
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/util/Random64.html
@@ -0,0 +1,221 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> *<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * or more contributor license agreements.  See the NOTICE file<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * distributed with this work for additional information<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * to you under the Apache License, Version 2.0 (the<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * "License"); you may not use this file except in compliance<a name="line.8"></a>
+<span class="sourceLineNo">009</span> * with the License.  You may obtain a copy of the License at<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.11"></a>
+<span class="sourceLineNo">012</span> *<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * Unless required by applicable law or agreed to in writing, software<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * See the License for the specific language governing permissions and<a name="line.16"></a>
+<span class="sourceLineNo">017</span> * limitations under the License.<a name="line.17"></a>
+<span class="sourceLineNo">018</span> */<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>package org.apache.hadoop.hbase.util;<a name="line.20"></a>
+<span class="sourceLineNo">021</span><a name="line.21"></a>
+<span class="sourceLineNo">022</span>import java.util.HashSet;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import java.util.Random;<a name="line.23"></a>
+<span class="sourceLineNo">024</span>import java.util.Set;<a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.util.concurrent.atomic.AtomicLong;<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>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.27"></a>
+<span class="sourceLineNo">028</span><a name="line.28"></a>
+<span class="sourceLineNo">029</span>/**<a name="line.29"></a>
+<span class="sourceLineNo">030</span> *<a name="line.30"></a>
+<span class="sourceLineNo">031</span> * An instance of this class is used to generate a stream of<a name="line.31"></a>
+<span class="sourceLineNo">032</span> * pseudorandom numbers. The class uses a 64-bit seed, which is<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * modified using a linear congruential formula.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> *<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * see https://en.wikipedia.org/wiki/Linear_congruential_generator<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@InterfaceAudience.Private<a name="line.37"></a>
+<span class="sourceLineNo">038</span>public class Random64 {<a name="line.38"></a>
+<span class="sourceLineNo">039</span><a name="line.39"></a>
+<span class="sourceLineNo">040</span>  private static final long multiplier = 6364136223846793005L;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final long addend = 1442695040888963407L;<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  private static final AtomicLong seedUniquifier<a name="line.43"></a>
+<span class="sourceLineNo">044</span>        = new AtomicLong(8682522807148012L);<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  private long seed;<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>   * Copy from {@link Random#seedUniquifier()}<a name="line.49"></a>
+<span class="sourceLineNo">050</span>   */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>  private static long seedUniquifier() {<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    for (; ; ) {<a name="line.52"></a>
+<span class="sourceLineNo">053</span>      long current = seedUniquifier.get();<a name="line.53"></a>
+<span class="sourceLineNo">054</span>      long next = current * 181783497276652981L;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>      if (seedUniquifier.compareAndSet(current, next)) {<a name="line.55"></a>
+<span class="sourceLineNo">056</span>        return next;<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><a name="line.60"></a>
+<span class="sourceLineNo">061</span>  public Random64() {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    this(seedUniquifier() ^ System.nanoTime());<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  }<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  public Random64(long seed) {<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    this.seed = seed;<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>  public long nextLong() {<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    return next64(64);<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>  public void nextBytes(byte[] bytes) {<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    for (int i = 0, len = bytes.length; i &lt; len;) {<a name="line.74"></a>
+<span class="sourceLineNo">075</span>      // We regard seed as unsigned long, therefore used '&gt;&gt;&gt;' instead of '&gt;&gt;'.<a name="line.75"></a>
+<span class="sourceLineNo">076</span>      for (long rnd = nextLong(), n = Math.min(len - i, Long.SIZE / Byte.SIZE);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>           n-- &gt; 0; rnd &gt;&gt;&gt;= Byte.SIZE) {<a name="line.77"></a>
+<span class="sourceLineNo">078</span>        bytes[i++] = (byte) rnd;<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>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private long next64(int bits) {<a name="line.83"></a>
+<span class="sourceLineNo">084</span>    seed = seed * multiplier + addend;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    return seed &gt;&gt;&gt; (64 - bits);<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><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  /**<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * Random64 is a pseudorandom algorithm(LCG). Therefore, we will get same sequence<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * if seeds are the same. This main will test how many calls nextLong() it will<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * get the same seed.<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   *<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   * We do not need to save all numbers (that is too large). We could save<a name="line.94"></a>
+<span class="sourceLineNo">095</span>   * once every 100000 calls nextLong(). If it get a same seed, we can<a name="line.95"></a>
+<span class="sourceLineNo">096</span>   * detect this by calling nextLong() 100000 times continuously.<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>  public static void main(String[] args) {<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    long defaultTotalTestCnt = 1000000000000L; // 1 trillion<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>    if (args.length == 1) {<a name="line.102"></a>
+<span class="sourceLineNo">103</span>      defaultTotalTestCnt = Long.parseLong(args[0]);<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>    Preconditions.checkArgument(defaultTotalTestCnt &gt; 0, "totalTestCnt &lt;= 0");<a name="line.106"></a>
+<span class="sourceLineNo">107</span><a name="line.107"></a>
+<span class="sourceLineNo">108</span>    final int precision = 100000;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    final long totalTestCnt = defaultTotalTestCnt + precision;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    final int reportPeriod = 100 * precision;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>    final long startTime = System.currentTimeMillis();<a name="line.111"></a>
+<span class="sourceLineNo">112</span><a name="line.112"></a>
+<span class="sourceLineNo">113</span>    System.out.println("Do collision test, totalTestCnt=" + totalTestCnt);<a name="line.113"></a>
+<span class="sourceLineNo">114</span><a name="line.114"></a>
+<span class="sourceLineNo">115</span>    Random64 rand = new Random64();<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    Set&lt;Long&gt; longSet = new HashSet&lt;&gt;();<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>    for (long cnt = 1; cnt &lt;= totalTestCnt; cnt++) {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>      final long randLong = rand.nextLong();<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (longSet.contains(randLong)) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        System.err.println("Conflict! count=" + cnt);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        System.exit(1);<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>      if (cnt % precision == 0) {<a name="line.126"></a>
+<span class="sourceLineNo">127</span>        if (!longSet.add(randLong)) {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>          System.err.println("Conflict! count=" + cnt);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>          System.exit(1);<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>        if (cnt % reportPeriod == 0) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>          long cost = System.currentTimeMillis() - startTime;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>          long remainingMs = (long) (1.0 * (totalTestCnt - cnt) * cost / cnt);<a name="line.134"></a>
+<span class="sourceLineNo">135</span>          System.out.println(<a name="line.135"></a>
+<span class="sourceLineNo">136</span>            String.format(<a name="line.136"></a>
+<span class="sourceLineNo">137</span>              "Progress: %.3f%%, remaining %d minutes",<a name="line.137"></a>
+<span class="sourceLineNo">138</span>              100.0 * cnt / totalTestCnt, remainingMs / 60000<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>        }<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><a name="line.145"></a>
+<span class="sourceLineNo">146</span>    System.out.println("No collision!");<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>}<a name="line.149"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>


[48/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
index 9aba51a..e5dc915 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.260">HMaster.InitializationMonitor</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.261">HMaster.InitializationMonitor</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" title="class in org.apache.hadoop.hbase.util">HasThread</a></pre>
 <div class="block">Protection against zombie master. Started once Master accepts active responsibility and
  starts taking over responsibilities. Allows a finite time window before giving up ownership.</div>
@@ -250,7 +250,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>TIMEOUT_KEY</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/master/HMaster.InitializationMonitor.html#line.262">TIMEOUT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.263">TIMEOUT_KEY</a></pre>
 <div class="block">The amount of time in milliseconds to sleep before checking initialization status.</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -264,7 +264,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>TIMEOUT_DEFAULT</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.263">TIMEOUT_DEFAULT</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.264">TIMEOUT_DEFAULT</a></pre>
 </li>
 </ul>
 <a name="HALT_KEY">
@@ -273,7 +273,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>HALT_KEY</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/master/HMaster.InitializationMonitor.html#line.269">HALT_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.270">HALT_KEY</a></pre>
 <div class="block">When timeout expired and initialization has not complete, call <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/System.html?is-external=true#exit-int-" title="class or interface in java.lang"><code>System.exit(int)</code></a> when
  true, do nothing otherwise.</div>
 <dl>
@@ -288,7 +288,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>HALT_DEFAULT</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.270">HALT_DEFAULT</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.271">HALT_DEFAULT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.InitializationMonitor.HALT_DEFAULT">Constant Field Values</a></dd>
@@ -301,7 +301,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>master</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.272">master</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.273">master</a></pre>
 </li>
 </ul>
 <a name="timeout">
@@ -310,7 +310,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockList">
 <li class="blockList">
 <h4>timeout</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.273">timeout</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.274">timeout</a></pre>
 </li>
 </ul>
 <a name="haltOnTimeout">
@@ -319,7 +319,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>haltOnTimeout</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.274">haltOnTimeout</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.275">haltOnTimeout</a></pre>
 </li>
 </ul>
 </li>
@@ -336,7 +336,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>InitializationMonitor</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.277">InitializationMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;master)</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.278">InitializationMonitor</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;master)</pre>
 <div class="block">Creates a Thread that monitors the <a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html#isInitialized--"><code>HMaster.isInitialized()</code></a> state.</div>
 </li>
 </ul>
@@ -354,7 +354,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/util/HasThread.html" tit
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.286">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.InitializationMonitor.html#line.287">run</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true#run--" title="class or interface in java.lang">run</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
index 27c31f9..72ee2d6 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
@@ -136,7 +136,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.3022">HMaster.MasterStoppedException</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.3029">HMaster.MasterStoppedException</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -205,7 +205,7 @@ extends <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterStoppedException</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html#line.3023">MasterStoppedException</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html#line.3030">MasterStoppedException</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index 19f6dea..8c598e5 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.443">HMaster.RedirectServlet</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.444">HMaster.RedirectServlet</a>
 extends javax.servlet.http.HttpServlet</pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -243,7 +243,7 @@ extends javax.servlet.http.HttpServlet</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>serialVersionUID</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.444">serialVersionUID</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.445">serialVersionUID</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.RedirectServlet.serialVersionUID">Constant Field Values</a></dd>
@@ -256,7 +256,7 @@ extends javax.servlet.http.HttpServlet</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerInfoPort</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.445">regionServerInfoPort</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.446">regionServerInfoPort</a></pre>
 </li>
 </ul>
 <a name="regionServerHostname">
@@ -265,7 +265,7 @@ extends javax.servlet.http.HttpServlet</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionServerHostname</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.446">regionServerHostname</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.447">regionServerHostname</a></pre>
 </li>
 </ul>
 </li>
@@ -282,7 +282,7 @@ extends javax.servlet.http.HttpServlet</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RedirectServlet</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.452">RedirectServlet</a>(<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a>&nbsp;infoServer,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.453">RedirectServlet</a>(<a href="../../../../../org/apache/hadoop/hbase/http/InfoServer.html" title="class in org.apache.hadoop.hbase.http">InfoServer</a>&nbsp;infoServer,
                        <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;hostname)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -305,7 +305,7 @@ extends javax.servlet.http.HttpServlet</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doGet</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.458">doGet</a>(javax.servlet.http.HttpServletRequest&nbsp;request,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html#line.459">doGet</a>(javax.servlet.http.HttpServletRequest&nbsp;request,
                   javax.servlet.http.HttpServletResponse&nbsp;response)
            throws javax.servlet.ServletException,
                   <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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
index eef3fbb..900105e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2441">HMaster.TableDescriptorGetter</a></pre>
+<pre>protected static interface <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.2448">HMaster.TableDescriptorGetter</a></pre>
 <div class="block">Implement to return TableDescriptor after pre-checks</div>
 </li>
 </ul>
@@ -150,7 +150,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>get</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html#line.2442">get</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html#line.2449">get</a>()
              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>


[07/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
index 2142742..be2a512 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.Strategies.html
@@ -129,174 +129,171 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
-<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return getWAL(group);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        failure = e;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return provider;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (failure != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      throw failure;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return logFileSize;<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 void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    listeners.add(listener);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>}<a name="line.291"></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>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    listeners.add(listener);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>}<a name="line.288"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
index 2142742..be2a512 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
@@ -129,174 +129,171 @@
 <span class="sourceLineNo">121</span><a name="line.121"></a>
 <span class="sourceLineNo">122</span>  /** delegate provider for WAL creation/roll/close */<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  public static final String DELEGATE_PROVIDER = "hbase.wal.regiongrouping.delegate.provider";<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  public static final String DELEGATE_PROVIDER_CLASS =<a name="line.124"></a>
-<span class="sourceLineNo">125</span>            "hbase.wal.regiongrouping.delegate.provider.class";<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      .name();<a name="line.127"></a>
+<span class="sourceLineNo">124</span>  public static final String DEFAULT_DELEGATE_PROVIDER = WALFactory.Providers.defaultProvider<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      .name();<a name="line.125"></a>
+<span class="sourceLineNo">126</span><a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  private static final String META_WAL_GROUP_NAME = "meta";<a name="line.129"></a>
-<span class="sourceLineNo">130</span><a name="line.130"></a>
-<span class="sourceLineNo">131</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.131"></a>
-<span class="sourceLineNo">132</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.132"></a>
+<span class="sourceLineNo">129</span>  /** A group-provider mapping, make sure one-one rather than many-one mapping */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  private final ConcurrentMap&lt;String, WALProvider&gt; cached = new ConcurrentHashMap&lt;&gt;();<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.132"></a>
 <span class="sourceLineNo">133</span><a name="line.133"></a>
-<span class="sourceLineNo">134</span>  private final KeyLocker&lt;String&gt; createLock = new KeyLocker&lt;&gt;();<a name="line.134"></a>
-<span class="sourceLineNo">135</span><a name="line.135"></a>
-<span class="sourceLineNo">136</span>  private RegionGroupingStrategy strategy;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private WALFactory factory;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>  private Configuration conf;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.139"></a>
-<span class="sourceLineNo">140</span>  private String providerId;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    if (null != strategy) {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.146"></a>
-<span class="sourceLineNo">147</span>    }<a name="line.147"></a>
-<span class="sourceLineNo">148</span>    this.conf = conf;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    this.factory = factory;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    if (providerId != null) {<a name="line.151"></a>
-<span class="sourceLineNo">152</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        sb.append(providerId);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      } else {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER_CLASS, DELEGATE_PROVIDER,<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.165"></a>
-<span class="sourceLineNo">166</span>    provider.init(factory, conf,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    return provider;<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>  @Override<a name="line.172"></a>
-<span class="sourceLineNo">173</span>  public List&lt;WAL&gt; getWALs() {<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  }<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private WAL getWAL(String group) throws IOException {<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    WALProvider provider = cached.get(group);<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    if (provider == null) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      Lock lock = createLock.acquireLock(group);<a name="line.180"></a>
-<span class="sourceLineNo">181</span>      try {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>        provider = cached.get(group);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>        if (provider == null) {<a name="line.183"></a>
-<span class="sourceLineNo">184</span>          provider = createProvider(group);<a name="line.184"></a>
-<span class="sourceLineNo">185</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>          cached.put(group, provider);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>        }<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      } finally {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>        lock.unlock();<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>    return provider.getWAL(null);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  @Override<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.196"></a>
-<span class="sourceLineNo">197</span>    String group;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      group = META_WAL_GROUP_NAME;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    } else {<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      byte[] id;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      byte[] namespace;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      if (region != null) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>        id = region.getEncodedNameAsBytes();<a name="line.204"></a>
-<span class="sourceLineNo">205</span>        namespace = region.getTable().getNamespace();<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      } else {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>        namespace = null;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      }<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      group = strategy.group(id, namespace);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    return getWAL(group);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>  }<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>  @Override<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  public void shutdown() throws IOException {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    // save the last exception and rethrow<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    IOException failure = null;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    for (WALProvider provider: cached.values()) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      try {<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        provider.shutdown();<a name="line.221"></a>
-<span class="sourceLineNo">222</span>      } catch (IOException e) {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        if (LOG.isDebugEnabled()) {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>        }<a name="line.226"></a>
-<span class="sourceLineNo">227</span>        failure = e;<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      }<a name="line.228"></a>
+<span class="sourceLineNo">134</span>  private RegionGroupingStrategy strategy;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private WALFactory factory;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>  private Configuration conf;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  private List&lt;WALActionsListener&gt; listeners = new ArrayList&lt;&gt;();<a name="line.137"></a>
+<span class="sourceLineNo">138</span>  private String providerId;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private Class&lt;? extends WALProvider&gt; providerClass;<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 void init(WALFactory factory, Configuration conf, String providerId) throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    if (null != strategy) {<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      throw new IllegalStateException("WALProvider.init should only be called once.");<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    }<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    this.conf = conf;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    this.factory = factory;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    StringBuilder sb = new StringBuilder().append(factory.factoryId);<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    if (providerId != null) {<a name="line.149"></a>
+<span class="sourceLineNo">150</span>      if (providerId.startsWith(WAL_FILE_NAME_DELIMITER)) {<a name="line.150"></a>
+<span class="sourceLineNo">151</span>        sb.append(providerId);<a name="line.151"></a>
+<span class="sourceLineNo">152</span>      } else {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>        sb.append(WAL_FILE_NAME_DELIMITER).append(providerId);<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>    this.providerId = sb.toString();<a name="line.156"></a>
+<span class="sourceLineNo">157</span>    this.strategy = getStrategy(conf, REGION_GROUPING_STRATEGY, DEFAULT_REGION_GROUPING_STRATEGY);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    this.providerClass = factory.getProviderClass(DELEGATE_PROVIDER, DEFAULT_DELEGATE_PROVIDER);<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>  private WALProvider createProvider(String group) throws IOException {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    WALProvider provider = WALFactory.createProvider(providerClass);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    provider.init(factory, conf,<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : group);<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    provider.addWALActionsListener(new MetricsWAL());<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    return provider;<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>  public List&lt;WAL&gt; getWALs() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return cached.values().stream().flatMap(p -&gt; p.getWALs().stream()).collect(Collectors.toList());<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>  private WAL getWAL(String group) throws IOException {<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    WALProvider provider = cached.get(group);<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    if (provider == null) {<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Lock lock = createLock.acquireLock(group);<a name="line.177"></a>
+<span class="sourceLineNo">178</span>      try {<a name="line.178"></a>
+<span class="sourceLineNo">179</span>        provider = cached.get(group);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        if (provider == null) {<a name="line.180"></a>
+<span class="sourceLineNo">181</span>          provider = createProvider(group);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>          listeners.forEach(provider::addWALActionsListener);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>          cached.put(group, provider);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>        }<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      } finally {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>        lock.unlock();<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>    return provider.getWAL(null);<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>  public WAL getWAL(RegionInfo region) throws IOException {<a name="line.193"></a>
+<span class="sourceLineNo">194</span>    String group;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      group = META_WAL_GROUP_NAME;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    } else {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      byte[] id;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>      byte[] namespace;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      if (region != null) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>        id = region.getEncodedNameAsBytes();<a name="line.201"></a>
+<span class="sourceLineNo">202</span>        namespace = region.getTable().getNamespace();<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      } else {<a name="line.203"></a>
+<span class="sourceLineNo">204</span>        id = HConstants.EMPTY_BYTE_ARRAY;<a name="line.204"></a>
+<span class="sourceLineNo">205</span>        namespace = null;<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      }<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      group = strategy.group(id, namespace);<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    }<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    return getWAL(group);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>  }<a name="line.210"></a>
+<span class="sourceLineNo">211</span><a name="line.211"></a>
+<span class="sourceLineNo">212</span>  @Override<a name="line.212"></a>
+<span class="sourceLineNo">213</span>  public void shutdown() throws IOException {<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    // save the last exception and rethrow<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    IOException failure = null;<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    for (WALProvider provider: cached.values()) {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      try {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>        provider.shutdown();<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      } catch (IOException e) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>        LOG.error("Problem shutting down wal provider '" + provider + "': " + e.getMessage());<a name="line.220"></a>
+<span class="sourceLineNo">221</span>        if (LOG.isDebugEnabled()) {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>          LOG.debug("Details of problem shutting down wal provider '" + provider + "'", e);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>        }<a name="line.223"></a>
+<span class="sourceLineNo">224</span>        failure = e;<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>    if (failure != null) {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      throw failure;<a name="line.228"></a>
 <span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    if (failure != null) {<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throw failure;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
-<span class="sourceLineNo">234</span><a name="line.234"></a>
-<span class="sourceLineNo">235</span>  @Override<a name="line.235"></a>
-<span class="sourceLineNo">236</span>  public void close() throws IOException {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    // save the last exception and rethrow<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    IOException failure = null;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    for (WALProvider provider : cached.values()) {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      try {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>        provider.close();<a name="line.241"></a>
-<span class="sourceLineNo">242</span>      } catch (IOException e) {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        if (LOG.isDebugEnabled()) {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.245"></a>
-<span class="sourceLineNo">246</span>        }<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        failure = e;<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      }<a name="line.248"></a>
+<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>  @Override<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  public void close() throws IOException {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    // save the last exception and rethrow<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    IOException failure = null;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    for (WALProvider provider : cached.values()) {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        provider.close();<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        LOG.error("Problem closing wal provider '" + provider + "': " + e.getMessage());<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isDebugEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.debug("Details of problem closing wal provider '" + provider + "'", e);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        failure = e;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    }<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    if (failure != null) {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      throw failure;<a name="line.248"></a>
 <span class="sourceLineNo">249</span>    }<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (failure != null) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      throw failure;<a name="line.251"></a>
-<span class="sourceLineNo">252</span>    }<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
-<span class="sourceLineNo">254</span><a name="line.254"></a>
-<span class="sourceLineNo">255</span>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    @Override<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    public void init(Configuration config, String providerId) {}<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    @Override<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>      return Bytes.toString(identifier);<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    }<a name="line.261"></a>
-<span class="sourceLineNo">262</span>  }<a name="line.262"></a>
-<span class="sourceLineNo">263</span><a name="line.263"></a>
-<span class="sourceLineNo">264</span>  @Override<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public long getNumLogFiles() {<a name="line.265"></a>
-<span class="sourceLineNo">266</span>    long numLogFiles = 0;<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    for (WALProvider provider : cached.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>      numLogFiles += provider.getNumLogFiles();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    return numLogFiles;<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  }<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>  @Override<a name="line.273"></a>
-<span class="sourceLineNo">274</span>  public long getLogFileSize() {<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    long logFileSize = 0;<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    for (WALProvider provider : cached.values()) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      logFileSize += provider.getLogFileSize();<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    return logFileSize;<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 void addWALActionsListener(WALActionsListener listener) {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    listeners.add(listener);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>  }<a name="line.290"></a>
-<span class="sourceLineNo">291</span>}<a name="line.291"></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>  static class IdentityGroupingStrategy implements RegionGroupingStrategy {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    @Override<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    public void init(Configuration config, String providerId) {}<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    @Override<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    public String group(final byte[] identifier, final byte[] namespace) {<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      return Bytes.toString(identifier);<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>  }<a name="line.259"></a>
+<span class="sourceLineNo">260</span><a name="line.260"></a>
+<span class="sourceLineNo">261</span>  @Override<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  public long getNumLogFiles() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    long numLogFiles = 0;<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (WALProvider provider : cached.values()) {<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      numLogFiles += provider.getNumLogFiles();<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    }<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    return numLogFiles;<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>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public long getLogFileSize() {<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    long logFileSize = 0;<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    for (WALProvider provider : cached.values()) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>      logFileSize += provider.getLogFileSize();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    return logFileSize;<a name="line.276"></a>
+<span class="sourceLineNo">277</span>  }<a name="line.277"></a>
+<span class="sourceLineNo">278</span><a name="line.278"></a>
+<span class="sourceLineNo">279</span>  @Override<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  public void addWALActionsListener(WALActionsListener listener) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    // Notice that there is an assumption that this method must be called before the getWAL above,<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    // so we can make sure there is no sub WALProvider yet, so we only add the listener to our<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    // listeners list without calling addWALActionListener for each WALProvider. Although it is no<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    // hurt to execute an extra loop to call addWALActionListener for each WALProvider, but if the<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    // extra code actually works, then we will have other big problems. So leave it as is.<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    listeners.add(listener);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>  }<a name="line.287"></a>
+<span class="sourceLineNo">288</span>}<a name="line.288"></a>
 
 
 


[35/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
index 721035e..f808b16 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.RedirectServlet.html
@@ -169,3778 +169,3785 @@
 <span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.161"></a>
 <span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.quotas.MasterQuotasObserver;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.quotas.QuotaObserverChore;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.regionserver.RSRpcServices;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.replication.ReplicationLoadSource;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
-<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
-<span class="sourceLineNo">242</span> *<a name="line.242"></a>
-<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> *<a name="line.246"></a>
-<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
-<span class="sourceLineNo">248</span> *<a name="line.248"></a>
-<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
-<span class="sourceLineNo">250</span> */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
-<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<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>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.setDaemon(true);<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>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  //Tracker for master maintenance mode setting<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  private ClusterSchemaService clusterSchemaService;<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    "hbase.master.wait.on.service.seconds";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  // Metrics for the HMaster<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  final MetricsMaster metricsMaster;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // file system manager for the master FS operations<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private MasterFileSystem fileSystemManager;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterWalManager walManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // server manager to deal with region server info<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private volatile ServerManager serverManager;<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // manager of assignment nodes in zookeeper<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private AssignmentManager assignmentManager;<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  // manager of replication<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  // buffer for "fatal error" notices from region servers<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // in the cluster. This is only used for assisting<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // operations/debugging.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // flag set after we become the active master (used for testing)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private volatile boolean activeMaster = false;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  // flag set after we complete initialization once active<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  // flag set after master services are started,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // initialization may have not completed yet.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  volatile boolean serviceStarted = false;<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Maximum time we should run balancer for<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  private final int maxBlancingTime;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Maximum percent of regions in transition when balancing<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  private final double maxRitPercent;<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private final LockManager lockManager = new LockManager(this);<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private LoadBalancer balancer;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private RegionNormalizer normalizer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private BalancerChore balancerChore;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private RegionNormalizerChore normalizerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private ClusterStatusChore clusterStatusChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  CatalogJanitor catalogJanitorChore;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private LogCleaner logCleaner;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private HFileCleaner hfileCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private MobCompactionChore mobCompactChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // used to synchronize the mobCompactionStates<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // save the information of mob compactions in tables.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  MasterCoprocessorHost cpHost;<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  private final boolean preLoadTableDescriptors;<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // Time stamps for when a hmaster became active<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  private long masterActiveTime;<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  private long masterFinishedInitializationTime;<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private final boolean masterCheckCompression;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  //should we check encryption settings at master side, default true<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private final boolean masterCheckEncryption;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // monitor for snapshot of hbase tables<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  SnapshotManager snapshotManager;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // monitor for distributed procedures<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private MasterProcedureManagerHost mpmHost;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  private volatile MasterQuotaManager quotaManager;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private QuotaObserverChore quotaObserverChore;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private WALProcedureStore procedureStore;<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // handle table states<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private TableStateManager tableStateManager;<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private long splitPlanCount;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long mergePlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /* Handle favored nodes information */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  private FavoredNodesManager favoredNodesManager;<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private Server masterJettyServer;<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public static class RedirectServlet extends HttpServlet {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private final int regionServerInfoPort;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final String regionServerHostname;<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>     * @param infoServer that we're trying to send all requests to<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     */<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       regionServerInfoPort = infoServer.getPort();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerHostname = hostname;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    public void doGet(HttpServletRequest request,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      String redirectHost = regionServerHostname;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      if(redirectHost == null) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        redirectHost = request.getServerName();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "to an appropriate hostname.");<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          return;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      String redirectUrl = request.getScheme() + "://"<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + request.getRequestURI();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      response.sendRedirect(redirectUrl);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Initializes the HMaster. The steps are as follows:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * &lt;p&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;ol&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;/ol&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;p&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * Remaining steps of initialization occur in<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * the master becomes the active one.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public HMaster(final Configuration conf)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throws IOException, KeeperException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    super(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    TraceUtil.initTracer(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      // Disable usage of meta replicas in the master<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>      decorateMasterConfiguration(this.conf);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>      // should we check encryption settings at master side, default true<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // preload table descriptor at startup<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Do we publish the status?<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.538"></a>
-<span class="sourceLineNo">539</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.Publisher.class);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (shouldPublish) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        if (publisherClass == null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              " is not set - not publishing status");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        } else {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        }<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>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      } else {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        this.activeMasterManager = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    } catch (Throwable t) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // cause of failed startup is lost.<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      LOG.error("Failed construction of Master", t);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw t;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  @Override<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // block in here until then.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  @Override<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void run() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            int infoPort = putUpJettyServer();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            startActiveMasterManager(infoPort);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          } catch (Throwable t) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            // Make sure we log the exception.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            String error = "Failed to become Active Master";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            LOG.error(error, t);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            // Abort should have been called already.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            if (!isAborted()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              abort(error, t);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }), getName() + ":becomeActiveMaster");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // the super run call will do this for us.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      super.run();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    } finally {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      if (this.clusterSchemaService != null) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>        // If on way out, then we are no longer active master.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        this.clusterSchemaService.stopAsync();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          this.clusterSchemaService.awaitTerminated(<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (TimeoutException te) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      this.activeMaster = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  // return the actual infoPort, -1 means disable info server.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  private int putUpJettyServer() throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return -1;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // -1 is for disabling info server, so no redirecting<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return -1;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if(infoPort == infoServer.getPort()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      return infoPort;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      String msg =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.629"></a>
-<span class="sourceLineNo">630</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + "hbase.master.info.bindAddress";<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      LOG.error(msg);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      throw new IOException(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // a second entire stack here.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    masterJettyServer = new Server();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    connector.setHost(addr);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setPort(infoPort);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    masterJettyServer.addConnector(connector);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final String redirectHostname =<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.setServer(masterJettyServer);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    try {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      masterJettyServer.start();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } catch (Exception e) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return connector.getLocalPort();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  @Override<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      super.login(user, host);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    } catch (IOException ie) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      user.login("hbase.master.keytab.file",<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        "hbase.master.kerberos.principal", host);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * If configured to put regions on active master,<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * wait till a backup master becomes active.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Override<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  protected void waitForMasterActive(){<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      sleeper.sleep();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  @VisibleForTesting<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return (MasterRpcServices)rpcServices;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Override<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  protected String getProcessName() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return MASTER;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  protected boolean canCreateBaseZNode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return true;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  protected boolean canUpdateTableDescriptor() {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    return true;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  @Override<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    return new MasterRpcServices(this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void configureInfoServer() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    infoServer.addServlet("master-status", "/master-status", MasterStatusServlet.class);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    infoServer.setAttribute(MASTER, this);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    if (LoadBalancer.isTablesOnMaster(conf)) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      super.configureInfoServer();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return MasterDumpServlet.class;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public MetricsMaster getMasterMetrics() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return metricsMaster;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * &lt;p&gt;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * Initialize all ZK based system trackers. But do not include {@link RegionServerTracker}, it<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * should have already been initialized along with {@link ServerManager}.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * &lt;/p&gt;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * &lt;p&gt;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   * Will be overridden in tests.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>   * &lt;/p&gt;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   */<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  @VisibleForTesting<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  protected void initializeZKBasedSystemTrackers()<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      throws IOException, InterruptedException, KeeperException, ReplicationException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    this.balancer = LoadBalancerFactory.getLoadBalancer(conf);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    this.normalizer.setMasterServices(this);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    this.loadBalancerTracker = new LoadBalancerTracker(zooKeeper, this);<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    this.loadBalancerTracker.start();<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    this.regionNormalizerTracker = new RegionNormalizerTracker(zooKeeper, this);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    this.regionNormalizerTracker.start();<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    this.splitOrMergeTracker = new SplitOrMergeTracker(zooKeeper, conf, this);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    this.splitOrMergeTracker.start();<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    this.replicationPeerManager = ReplicationPeerManager.create(zooKeeper, conf);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    this.syncReplicationReplayWALManager = new SyncReplicationReplayWALManager(this);<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    this.drainingServerTracker = new DrainingServerTracker(zooKeeper, this, this.serverManager);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    this.drainingServerTracker.start();<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>    this.maintenanceModeTracker = new MasterMaintenanceModeTracker(zooKeeper);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    this.maintenanceModeTracker.start();<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    String clientQuorumServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    boolean clientZkObserverMode = conf.getBoolean(HConstants.CLIENT_ZOOKEEPER_OBSERVER_MODE,<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      HConstants.DEFAULT_CLIENT_ZOOKEEPER_OBSERVER_MODE);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (clientQuorumServers != null &amp;&amp; !clientZkObserverMode) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      // we need to take care of the ZK information synchronization<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      // if given client ZK are not observer nodes<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      ZKWatcher clientZkWatcher = new ZKWatcher(conf,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          getProcessName() + ":" + rpcServices.getSocketAddress().getPort() + "-clientZK", this,<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          false, true);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      this.metaLocationSyncer = new MetaLocationSyncer(zooKeeper, clientZkWatcher, this);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.metaLocationSyncer.start();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      this.masterAddressSyncer = new MasterAddressSyncer(zooKeeper, clientZkWatcher, this);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.masterAddressSyncer.start();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      // set cluster id is a one-go effort<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      ZKClusterId.setClusterId(clientZkWatcher, fileSystemManager.getClusterId());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Set the cluster as up.  If new RSs, they'll be waiting on this before<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // going ahead with their startup.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    boolean wasUp = this.clusterStatusTracker.isClusterUp();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    if (!wasUp) this.clusterStatusTracker.setClusterUp();<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    LOG.info("Active/primary master=" + this.serverName +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        ", sessionid=0x" +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()) +<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        ", setting cluster-up flag (Was=" + wasUp + ")");<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>    // create/initialize the snapshot manager and other procedure managers<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    this.snapshotManager = new SnapshotManager();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    this.mpmHost = new MasterProcedureManagerHost();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    this.mpmHost.register(this.snapshotManager);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    this.mpmHost.register(new MasterFlushTableProcedureManager());<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.mpmHost.loadProcedures(conf);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    this.mpmHost.initialize(this, this.metricsMaster);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  private static final ImmutableSet&lt;Class&lt;?&gt;&gt; UNSUPPORTED_PROCEDURES =<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ImmutableSet.of(RecoverMetaProcedure.class, AssignProcedure.class, UnassignProcedure.class,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      MoveRegionProcedure.class);<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * make sure that there are none these procedures when upgrading. If there are, the master will<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * quit, you need to go back to the old version to finish these procedures first before upgrading.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   */<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  private void checkUnsupportedProcedure(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType)<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throws HBaseIOException {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    // Confirm that we do not have unfinished assign/unassign related procedures. It is not easy to<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    // support both the old assign/unassign procedures and the new TransitRegionStateProcedure as<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    // there will be conflict in the code for AM. We should finish all these procedures before<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    // upgrading.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    for (Class&lt;?&gt; clazz : UNSUPPORTED_PROCEDURES) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt; procs = procsByType.get(clazz);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      if (procs != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        LOG.error(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          "Unsupported procedure type {} found, please rollback your master to the old" +<a name="line.831"></a>
-<span class="sourceLineNo">832</span>            " version to finish them, and then try to upgrade again. The full procedure list: {}",<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          clazz, procs);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        throw new HBaseIOException("Unsupported procedure type " + clazz + " found");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // A special check for SCP, as we do not support RecoverMetaProcedure any more so we need to<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    // make sure that no one will try to schedule it but SCP does have a state which will schedule<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    // it.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    if (procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      .map(p -&gt; (ServerCrashProcedure) p).anyMatch(ServerCrashProcedure::isInRecoverMetaState)) {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      LOG.error("At least one ServerCrashProcedure is going to schedule a RecoverMetaProcedure," +<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        " which is not supported any more. Please rollback your master to the old version to" +<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        " finish them, and then try to upgrade again.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      throw new HBaseIOException("Unsupported procedure state found for ServerCrashProcedure");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  // Will be overriden in test to inject customized AssignmentManager<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  @VisibleForTesting<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected AssignmentManager createAssignmentManager(MasterServices master) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return new AssignmentManager(master);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  /**<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * Finish initialization of HMaster after becoming the primary master.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * &lt;p/&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * The startup order is a bit complicated but very important, do not change it unless you know<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * what you are doing.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   * &lt;ol&gt;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>   * &lt;li&gt;Initialize file system based components - file system manager, wal manager, table<a name="line.861"></a>
-<span class="sourceLineNo">862</span>   * descriptors, etc&lt;/li&gt;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>   * &lt;li&gt;Publish cluster id&lt;/li&gt;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * &lt;li&gt;Here comes the most complicated part - initialize server manager, assignment manager and<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * region server tracker<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * &lt;ol type='i'&gt;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * &lt;li&gt;Create server manager&lt;/li&gt;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * &lt;li&gt;Create procedure executor, load the procedures, but do not start workers. We will start it<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * later after we finish scheduling SCPs to avoid scheduling duplicated SCPs for the same<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * server&lt;/li&gt;<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * &lt;li&gt;Create assignment manager and start it, load the meta region state, but do not load data<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * from meta region&lt;/li&gt;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * &lt;li&gt;Start region server tracker, construct the online servers set and find out dead servers and<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * schedule SCP for them. The online servers will be constructed by scanning zk, and we will also<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * scan the wal directory to find out possible live region servers, and the differences between<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * these two sets are the dead servers&lt;/li&gt;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;/ol&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * &lt;/li&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * &lt;li&gt;If this is a new deploy, schedule a InitMetaProcedure to initialize meta&lt;/li&gt;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * &lt;li&gt;Start necessary service threads - balancer, catalog janior, executor services, and also the<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * procedure executor, etc. Notice that the balancer must be created first as assignment manager<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * may use it when assigning regions.&lt;/li&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * &lt;li&gt;Wait for meta to be initialized if necesssary, start table state manager.&lt;/li&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * &lt;li&gt;Wait for enough region servers to check-in&lt;/li&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * &lt;li&gt;Let assignment manager load data from meta and construct region states&lt;/li&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * &lt;li&gt;Start all other things such as chore services, etc&lt;/li&gt;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   * &lt;/ol&gt;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>   * &lt;p/&gt;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Notice that now we will not schedule a special procedure to make meta online(unless the first<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * time where meta has not been created yet), we will rely on SCP to bring meta online.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  private void finishActiveMasterInitialization(MonitoredTask status) throws IOException,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          InterruptedException, KeeperException, ReplicationException {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    Thread zombieDetector = new Thread(new InitializationMonitor(this),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        "ActiveMasterInitializationMonitor-" + System.currentTimeMillis());<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    zombieDetector.setDaemon(true);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    zombieDetector.start();<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>    /*<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * We are active master now... go initialize components we need to run.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    status.setStatus("Initializing Master file system");<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>    this.masterActiveTime = System.currentTimeMillis();<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // TODO: Do this using Dependency Injection, using PicoContainer, Guice or Spring.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    // Initialize the chunkCreator<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    initializeMemStoreChunkCreator();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    this.fileSystemManager = new MasterFileSystem(conf);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    this.walManager = new MasterWalManager(this);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // enable table descriptors cache<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    this.tableDescriptors.setCacheOn();<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // warm-up HTDs cache on master initialization<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    if (preLoadTableDescriptors) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      status.setStatus("Pre-loading table descriptors");<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      this.tableDescriptors.getAll();<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Publish cluster ID; set it in Master too. The superclass RegionServer does this later but<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    // only after it has checked in with the Master. At least a few tests ask Master for clusterId<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // before it has called its run method and before RegionServer has done the reportForDuty.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    ClusterId clusterId = fileSystemManager.getClusterId();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    status.setStatus("Publishing Cluster ID " + clusterId + " in ZooKeeper");<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    ZKClusterId.setClusterId(this.zooKeeper, fileSystemManager.getClusterId());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    this.clusterId = clusterId.toString();<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // Precaution. Put in place the old hbck1 lock file to fence out old hbase1s running their<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // hbck1s against an hbase2 cluster; it could do damage. To skip this behavior, set<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // hbase.write.hbck1.lock.file to false.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (this.conf.getBoolean("hbase.write.hbck1.lock.file", true)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      HBaseFsck.checkAndMarkRunningHbck(this.conf,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          HBaseFsck.createLockRetryCounterFactory(this.conf).create());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    status.setStatus("Initialize ServerManager and schedule SCP for crash servers");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    this.serverManager = createServerManager(this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    createProcedureExecutor();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    @SuppressWarnings("rawtypes")<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType =<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      procedureExecutor.getActiveProceduresNoCopy().stream()<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        .collect(Collectors.groupingBy(p -&gt; p.getClass()));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>    checkUnsupportedProcedure(procsByType);<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    // Create Assignment Manager<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    this.assignmentManager = createAssignmentManager(this);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    this.assignmentManager.start();<a name="line.948"></a>
-<span class="sourceLineNo">949</span>    // TODO: TRSP can perform as the sub procedure for other procedures, so even if it is marked as<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    // completed, it could still be in the procedure list. This is a bit strange but is another<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    // story, need to verify the implementation for ProcedureExecutor and ProcedureStore.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    List&lt;TransitRegionStateProcedure&gt; ritList =<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      procsByType.getOrDefault(TransitRegionStateProcedure.class, Collections.emptyList()).stream()<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        .filter(p -&gt; !p.isFinished()).map(p -&gt; (TransitRegionStateProcedure) p)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        .collect(Collectors.toList());<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    this.assignmentManager.setupRIT(ritList);<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // Start RegionServerTracker with listing of servers found with exiting SCPs -- these should<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // be registered in the deadServers set -- and with the list of servernames out on the<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    // filesystem that COULD BE 'alive' (we'll schedule SCPs for each and let SCP figure it out).<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    // We also pass dirs that are already 'splitting'... so we can do some checks down in tracker.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // TODO: Generate the splitting and live Set in one pass instead of two as we currently do.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    this.regionServerTracker = new RegionServerTracker(zooKeeper, this, this.serverManager);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    this.regionServerTracker.start(<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        .map(p -&gt; (ServerCrashProcedure) p).map(p -&gt; p.getServerName()).collect(Collectors.toSet()),<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      walManager.getLiveServersFromWALDir(), walManager.getSplittingServersFromWALDir());<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    // This manager will be started AFTER hbase:meta is confirmed on line.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    // hbase.mirror.table.state.to.zookeeper is so hbase1 clients can connect. They read table<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    // state from zookeeper while hbase2 reads it from hbase:meta. Disable if no hbase1 clients.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    this.tableStateManager =<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY, true)<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        ?<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        new MirroringTableStateManager(this):<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        new TableStateManager(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    status.setStatus("Initializing ZK system trackers");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    initializeZKBasedSystemTrackers();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    status.setStatus("Loading last flushed sequence id of regions");<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    try {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    } catch (IOException e) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          + " from file system", e);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    this.activeMaster = true;<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>    // This is for backwards compatibility<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // See HBASE-11393<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    status.setStatus("Update TableCFs node in ZNode");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    ReplicationPeerConfigUpgrader tableCFsUpdater =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        new ReplicationPeerConfigUpgrader(zooKeeper, conf);<a name="line.993">

<TRUNCATED>

[12/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
index f1a6dfa..e0f7285 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
@@ -416,735 +416,730 @@
 <span class="sourceLineNo">408</span>    this.blocksize = WALUtil.getWALBlockSize(this.conf, this.fs, this.walDir);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>    float multiplier = conf.getFloat("hbase.regionserver.logroll.multiplier", 0.5f);<a name="line.409"></a>
 <span class="sourceLineNo">410</span>    this.logrollsize = (long)(this.blocksize * multiplier);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    boolean maxLogsDefined = conf.get("hbase.regionserver.maxlogs") != null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (maxLogsDefined) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      LOG.warn("'hbase.regionserver.maxlogs' was deprecated.");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    this.maxLogs = conf.getInt("hbase.regionserver.maxlogs",<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Math.max(32, calculateMaxLogFiles(conf, logrollsize)));<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    LOG.info("WAL configuration: blocksize=" + StringUtils.byteDesc(blocksize) + ", rollsize=" +<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      StringUtils.byteDesc(this.logrollsize) + ", prefix=" + this.walFilePrefix + ", suffix=" +<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      walFileSuffix + ", logDir=" + this.walDir + ", archiveDir=" + this.walArchiveDir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    this.slowSyncNs = TimeUnit.MILLISECONDS<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        .toNanos(conf.getInt("hbase.regionserver.hlog.slowsync.ms", DEFAULT_SLOW_SYNC_TIME_MS));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    this.walSyncTimeoutNs = TimeUnit.MILLISECONDS<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        .toNanos(conf.getLong("hbase.regionserver.hlog.sync.timeout", DEFAULT_WAL_SYNC_TIMEOUT_MS));<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    this.cachedSyncFutures = new ThreadLocal&lt;SyncFuture&gt;() {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      protected SyncFuture initialValue() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        return new SyncFuture();<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>    this.implClassName = getClass().getSimpleName();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<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>   * Used to initialize the WAL. Usually just call rollWriter to create the first log writer.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void init() throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    rollWriter();<a name="line.439"></a>
+<span class="sourceLineNo">411</span>    this.maxLogs = conf.getInt("hbase.regionserver.maxlogs",<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      Math.max(32, calculateMaxLogFiles(conf, logrollsize)));<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    LOG.info("WAL configuration: blocksize=" + StringUtils.byteDesc(blocksize) + ", rollsize=" +<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      StringUtils.byteDesc(this.logrollsize) + ", prefix=" + this.walFilePrefix + ", suffix=" +<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      walFileSuffix + ", logDir=" + this.walDir + ", archiveDir=" + this.walArchiveDir);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    this.slowSyncNs = TimeUnit.MILLISECONDS<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        .toNanos(conf.getInt("hbase.regionserver.hlog.slowsync.ms", DEFAULT_SLOW_SYNC_TIME_MS));<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    this.walSyncTimeoutNs = TimeUnit.MILLISECONDS<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        .toNanos(conf.getLong("hbase.regionserver.hlog.sync.timeout", DEFAULT_WAL_SYNC_TIMEOUT_MS));<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    this.cachedSyncFutures = new ThreadLocal&lt;SyncFuture&gt;() {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      @Override<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      protected SyncFuture initialValue() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        return new SyncFuture();<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>    this.implClassName = getClass().getSimpleName();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<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>   * Used to initialize the WAL. Usually just call rollWriter to create the first log writer.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  public void init() throws IOException {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    rollWriter();<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>  @Override<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public void registerWALActionsListener(WALActionsListener listener) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    this.listeners.add(listener);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
 <span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void registerWALActionsListener(WALActionsListener listener) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    this.listeners.add(listener);<a name="line.444"></a>
+<span class="sourceLineNo">443</span>  public boolean unregisterWALActionsListener(WALActionsListener listener) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return this.listeners.remove(listener);<a name="line.444"></a>
 <span class="sourceLineNo">445</span>  }<a name="line.445"></a>
 <span class="sourceLineNo">446</span><a name="line.446"></a>
 <span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public boolean unregisterWALActionsListener(WALActionsListener listener) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    return this.listeners.remove(listener);<a name="line.449"></a>
+<span class="sourceLineNo">448</span>  public WALCoprocessorHost getCoprocessorHost() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return coprocessorHost;<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>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public WALCoprocessorHost getCoprocessorHost() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return coprocessorHost;<a name="line.454"></a>
+<span class="sourceLineNo">453</span>  public Long startCacheFlush(byte[] encodedRegionName, Set&lt;byte[]&gt; families) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, families);<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
 <span class="sourceLineNo">457</span>  @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public Long startCacheFlush(byte[] encodedRegionName, Set&lt;byte[]&gt; families) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, families);<a name="line.459"></a>
+<span class="sourceLineNo">458</span>  public Long startCacheFlush(byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, familyToSeq);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>  }<a name="line.460"></a>
 <span class="sourceLineNo">461</span><a name="line.461"></a>
 <span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  public Long startCacheFlush(byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, familyToSeq);<a name="line.464"></a>
+<span class="sourceLineNo">463</span>  public void completeCacheFlush(byte[] encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this.sequenceIdAccounting.completeCacheFlush(encodedRegionName);<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>  public void completeCacheFlush(byte[] encodedRegionName) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    this.sequenceIdAccounting.completeCacheFlush(encodedRegionName);<a name="line.469"></a>
+<span class="sourceLineNo">468</span>  public void abortCacheFlush(byte[] encodedRegionName) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sequenceIdAccounting.abortCacheFlush(encodedRegionName);<a name="line.469"></a>
 <span class="sourceLineNo">470</span>  }<a name="line.470"></a>
 <span class="sourceLineNo">471</span><a name="line.471"></a>
 <span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
-<span class="sourceLineNo">473</span>  public void abortCacheFlush(byte[] encodedRegionName) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    this.sequenceIdAccounting.abortCacheFlush(encodedRegionName);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  @Override<a name="line.477"></a>
-<span class="sourceLineNo">478</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    // Used by tests. Deprecated as too subtle for general usage.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>  @Override<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    // This method is used by tests and for figuring if we should flush or not because our<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // sequenceids are too old. It is also used reporting the master our oldest sequenceid for use<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    // figuring what edits can be skipped during log recovery. getEarliestMemStoreSequenceId<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // from this.sequenceIdAccounting is looking first in flushingOldestStoreSequenceIds, the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // currently flushing sequence ids, and if anything found there, it is returning these. This is<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    // the right thing to do for the reporting oldest sequenceids to master; we won't skip edits if<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    // we crash during the flush. For figuring what to flush, we might get requeued if our sequence<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    // id is old even though we are currently flushing. This may mean we do too much flushing.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName, familyName);<a name="line.493"></a>
+<span class="sourceLineNo">473</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    // Used by tests. Deprecated as too subtle for general usage.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName);<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>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    // This method is used by tests and for figuring if we should flush or not because our<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // sequenceids are too old. It is also used reporting the master our oldest sequenceid for use<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    // figuring what edits can be skipped during log recovery. getEarliestMemStoreSequenceId<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // from this.sequenceIdAccounting is looking first in flushingOldestStoreSequenceIds, the<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // currently flushing sequence ids, and if anything found there, it is returning these. This is<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // the right thing to do for the reporting oldest sequenceids to master; we won't skip edits if<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // we crash during the flush. For figuring what to flush, we might get requeued if our sequence<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // id is old even though we are currently flushing. This may mean we do too much flushing.<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName, familyName);<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>  public byte[][] rollWriter() throws FailedLogCloseException, IOException {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return rollWriter(false);<a name="line.493"></a>
 <span class="sourceLineNo">494</span>  }<a name="line.494"></a>
 <span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>  @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public byte[][] rollWriter() throws FailedLogCloseException, IOException {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return rollWriter(false);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * This is a convenience method that computes a new filename with a given file-number.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @param filenum to use<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * @return Path<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   */<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  protected Path computeFilename(final long filenum) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    if (filenum &lt; 0) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      throw new RuntimeException("WAL file number can't be &lt; 0");<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    String child = walFilePrefix + WAL_FILE_NAME_DELIMITER + filenum + walFileSuffix;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return new Path(walDir, child);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * This is a convenience method that computes a new filename with a given using the current WAL<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * file-number<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return Path<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getCurrentFileName() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return computeFilename(this.filenum.get());<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>   * retrieve the next path to use for writing. Increments the internal filenum.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   */<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private Path getNewPath() throws IOException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    this.filenum.set(System.currentTimeMillis());<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    Path newPath = getCurrentFileName();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    while (fs.exists(newPath)) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.filenum.incrementAndGet();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      newPath = getCurrentFileName();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return newPath;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @VisibleForTesting<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  Path getOldPath() {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    long currentFilenum = this.filenum.get();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    Path oldPath = null;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    if (currentFilenum &gt; 0) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // ComputeFilename will take care of meta wal filename<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      oldPath = computeFilename(currentFilenum);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    } // I presume if currentFilenum is &lt;= 0, this is first file and null for oldPath if fine?<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    return oldPath;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  }<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>   * Tell listeners about pre log roll.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private void tellListenersAboutPreLogRoll(final Path oldPath, final Path newPath)<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      throws IOException {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    coprocessorHost.preWALRoll(oldPath, newPath);<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (!this.listeners.isEmpty()) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      for (WALActionsListener i : this.listeners) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        i.preLogRoll(oldPath, newPath);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  }<a name="line.559"></a>
-<span class="sourceLineNo">560</span><a name="line.560"></a>
-<span class="sourceLineNo">561</span>  /**<a name="line.561"></a>
-<span class="sourceLineNo">562</span>   * Tell listeners about post log roll.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   */<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private void tellListenersAboutPostLogRoll(final Path oldPath, final Path newPath)<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      throws IOException {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (!this.listeners.isEmpty()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      for (WALActionsListener i : this.listeners) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        i.postLogRoll(oldPath, newPath);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    coprocessorHost.postWALRoll(oldPath, newPath);<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  }<a name="line.573"></a>
-<span class="sourceLineNo">574</span><a name="line.574"></a>
-<span class="sourceLineNo">575</span>  // public only until class moves to o.a.h.h.wal<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /** @return the number of rolled log files */<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  public int getNumRolledLogFiles() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    return walFile2Props.size();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>  // public only until class moves to o.a.h.h.wal<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  /** @return the number of log files in use */<a name="line.582"></a>
-<span class="sourceLineNo">583</span>  public int getNumLogFiles() {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    // +1 for current use log<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return getNumRolledLogFiles() + 1;<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * If the number of un-archived WAL files is greater than maximum allowed, check the first<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * (oldest) WAL file, and returns those regions which should be flushed so that it can be<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * archived.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @return regions (encodedRegionNames) to flush in order to archive oldest WAL file.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  byte[][] findRegionsToForceFlush() throws IOException {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    byte[][] regions = null;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    int logCount = getNumRolledLogFiles();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    if (logCount &gt; this.maxLogs &amp;&amp; logCount &gt; 0) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Map.Entry&lt;Path, WalProps&gt; firstWALEntry = this.walFile2Props.firstEntry();<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      regions =<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.sequenceIdAccounting.findLower(firstWALEntry.getValue().encodedName2HighestSequenceId);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    if (regions != null) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      StringBuilder sb = new StringBuilder();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      for (int i = 0; i &lt; regions.length; i++) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        if (i &gt; 0) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          sb.append(", ");<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        sb.append(Bytes.toStringBinary(regions[i]));<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      LOG.info("Too many WALs; count=" + logCount + ", max=" + this.maxLogs +<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        "; forcing flush of " + regions.length + " regions(s): " + sb.toString());<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    return regions;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  /**<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   * Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   */<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  private void cleanOldLogs() throws IOException {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    List&lt;Pair&lt;Path, Long&gt;&gt; logsToArchive = null;<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    // For each log file, look at its Map of regions to highest sequence id; if all sequence ids<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // are older than what is currently in memory, the WAL can be GC'd.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    for (Map.Entry&lt;Path, WalProps&gt; e : this.walFile2Props.entrySet()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      Path log = e.getKey();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      Map&lt;byte[], Long&gt; sequenceNums = e.getValue().encodedName2HighestSequenceId;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (this.sequenceIdAccounting.areAllLower(sequenceNums)) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (logsToArchive == null) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>          logsToArchive = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        logsToArchive.add(Pair.newPair(log, e.getValue().logSize));<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (LOG.isTraceEnabled()) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          LOG.trace("WAL file ready for archiving " + log);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    if (logsToArchive != null) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      for (Pair&lt;Path, Long&gt; logAndSize : logsToArchive) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        this.totalLogSize.addAndGet(-logAndSize.getSecond());<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        archiveLogFile(logAndSize.getFirst());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        this.walFile2Props.remove(logAndSize.getFirst());<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      }<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>  /*<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * only public so WALSplitter can use.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   * @return archived location of a WAL file with the given path p<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   */<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  public static Path getWALArchivePath(Path archiveDir, Path p) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    return new Path(archiveDir, p.getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>  private void archiveLogFile(final Path p) throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    Path newPath = getWALArchivePath(this.walArchiveDir, p);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    // Tell our listeners that a log is going to be archived.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    if (!this.listeners.isEmpty()) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      for (WALActionsListener i : this.listeners) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        i.preLogArchive(p, newPath);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    LOG.info("Archiving " + p + " to " + newPath);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (!CommonFSUtils.renameAndSetModifyTime(this.fs, p, newPath)) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      throw new IOException("Unable to rename " + p + " to " + newPath);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    // Tell our listeners that a log has been archived.<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    if (!this.listeners.isEmpty()) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      for (WALActionsListener i : this.listeners) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        i.postLogArchive(p, newPath);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
-<span class="sourceLineNo">672</span><a name="line.672"></a>
-<span class="sourceLineNo">673</span>  protected final void logRollAndSetupWalProps(Path oldPath, Path newPath, long oldFileLen) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    int oldNumEntries = this.numEntries.getAndSet(0);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    String newPathString = newPath != null ? CommonFSUtils.getPath(newPath) : null;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    if (oldPath != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      this.walFile2Props.put(oldPath,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        new WalProps(this.sequenceIdAccounting.resetHighest(), oldFileLen));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      this.totalLogSize.addAndGet(oldFileLen);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      LOG.info("Rolled WAL {} with entries={}, filesize={}; new WAL {}",<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        CommonFSUtils.getPath(oldPath), oldNumEntries, StringUtils.byteDesc(oldFileLen),<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        newPathString);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    } else {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      LOG.info("New WAL {}", newPathString);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>  /**<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * &lt;p&gt;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * Cleans up current writer closing it and then puts in place the passed in<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * &lt;code&gt;nextWriter&lt;/code&gt;.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * &lt;/p&gt;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * &lt;p&gt;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * &lt;ul&gt;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * &lt;li&gt;In the case of creating a new WAL, oldPath will be null.&lt;/li&gt;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * &lt;li&gt;In the case of rolling over from one file to the next, none of the parameters will be null.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * &lt;/li&gt;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * &lt;li&gt;In the case of closing out this FSHLog with no further use newPath and nextWriter will be<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * null.&lt;/li&gt;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * &lt;/ul&gt;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * &lt;/p&gt;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * @param oldPath may be null<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * @param newPath may be null<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   * @param nextWriter may be null<a name="line.704"></a>
-<span class="sourceLineNo">705</span>   * @return the passed in &lt;code&gt;newPath&lt;/code&gt;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * @throws IOException if there is a problem flushing or closing the underlying FS<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   */<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  @VisibleForTesting<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  Path replaceWriter(Path oldPath, Path newPath, W nextWriter) throws IOException {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    try (TraceScope scope = TraceUtil.createTrace("FSHFile.replaceWriter")) {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      doReplaceWriter(oldPath, newPath, nextWriter);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return newPath;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  protected final void blockOnSync(SyncFuture syncFuture) throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    // Now we have published the ringbuffer, halt the current thread until we get an answer back.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    try {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      if (syncFuture != null) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        if (closed) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          throw new IOException("WAL has been closed");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        } else {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          syncFuture.get(walSyncTimeoutNs);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    } catch (TimeoutIOException tioe) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      // SyncFuture reuse by thread, if TimeoutIOException happens, ringbuffer<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      // still refer to it, so if this thread use it next time may get a wrong<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      // result.<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.cachedSyncFutures.remove();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      throw tioe;<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    } catch (InterruptedException ie) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      LOG.warn("Interrupted", ie);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      throw convertInterruptedExceptionToIOException(ie);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    } catch (ExecutionException e) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      throw ensureIOException(e.getCause());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  private static IOException ensureIOException(final Throwable t) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    return (t instanceof IOException) ? (IOException) t : new IOException(t);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
-<span class="sourceLineNo">743</span><a name="line.743"></a>
-<span class="sourceLineNo">744</span>  private IOException convertInterruptedExceptionToIOException(final InterruptedException ie) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    Thread.currentThread().interrupt();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    IOException ioe = new InterruptedIOException();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    ioe.initCause(ie);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    return ioe;<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  }<a name="line.749"></a>
-<span class="sourceLineNo">750</span><a name="line.750"></a>
-<span class="sourceLineNo">751</span>  @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public byte[][] rollWriter(boolean force) throws FailedLogCloseException, IOException {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    rollWriterLock.lock();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    try {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (this.closed) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        throw new WALClosedException("WAL has been closed");<a name="line.756"></a>
-<span class="sourceLineNo">757</span>      }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>      // Return if nothing to flush.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      if (!force &amp;&amp; this.writer != null &amp;&amp; this.numEntries.get() &lt;= 0) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        return null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      byte[][] regionsToFlush = null;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      try (TraceScope scope = TraceUtil.createTrace("FSHLog.rollWriter")) {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        Path oldPath = getOldPath();<a name="line.764"></a>
-<span class="sourceLineNo">765</span>        Path newPath = getNewPath();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>        // Any exception from here on is catastrophic, non-recoverable so we currently abort.<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        W nextWriter = this.createWriterInstance(newPath);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        tellListenersAboutPreLogRoll(oldPath, newPath);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        // NewPath could be equal to oldPath if replaceWriter fails.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        newPath = replaceWriter(oldPath, newPath, nextWriter);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        tellListenersAboutPostLogRoll(oldPath, newPath);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>        if (LOG.isDebugEnabled()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>          LOG.debug("Create new " + implClassName + " writer with pipeline: " +<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            Arrays.toString(getPipeline()));<a name="line.774"></a>
+<span class="sourceLineNo">496</span>  /**<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * This is a convenience method that computes a new filename with a given file-number.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   * @param filenum to use<a name="line.498"></a>
+<span class="sourceLineNo">499</span>   * @return Path<a name="line.499"></a>
+<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  protected Path computeFilename(final long filenum) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    if (filenum &lt; 0) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      throw new RuntimeException("WAL file number can't be &lt; 0");<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    String child = walFilePrefix + WAL_FILE_NAME_DELIMITER + filenum + walFileSuffix;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return new Path(walDir, child);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  /**<a name="line.509"></a>
+<span class="sourceLineNo">510</span>   * This is a convenience method that computes a new filename with a given using the current WAL<a name="line.510"></a>
+<span class="sourceLineNo">511</span>   * file-number<a name="line.511"></a>
+<span class="sourceLineNo">512</span>   * @return Path<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   */<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  public Path getCurrentFileName() {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    return computeFilename(this.filenum.get());<a name="line.515"></a>
+<span class="sourceLineNo">516</span>  }<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>   * retrieve the next path to use for writing. Increments the internal filenum.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   */<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private Path getNewPath() throws IOException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    this.filenum.set(System.currentTimeMillis());<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    Path newPath = getCurrentFileName();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    while (fs.exists(newPath)) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      this.filenum.incrementAndGet();<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      newPath = getCurrentFileName();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    return newPath;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>  @VisibleForTesting<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  Path getOldPath() {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    long currentFilenum = this.filenum.get();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    Path oldPath = null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    if (currentFilenum &gt; 0) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      // ComputeFilename will take care of meta wal filename<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      oldPath = computeFilename(currentFilenum);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    } // I presume if currentFilenum is &lt;= 0, this is first file and null for oldPath if fine?<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    return oldPath;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<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>   * Tell listeners about pre log roll.<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
+<span class="sourceLineNo">545</span>  private void tellListenersAboutPreLogRoll(final Path oldPath, final Path newPath)<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      throws IOException {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    coprocessorHost.preWALRoll(oldPath, newPath);<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>    if (!this.listeners.isEmpty()) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      for (WALActionsListener i : this.listeners) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>        i.preLogRoll(oldPath, newPath);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
+<span class="sourceLineNo">555</span><a name="line.555"></a>
+<span class="sourceLineNo">556</span>  /**<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   * Tell listeners about post log roll.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>  private void tellListenersAboutPostLogRoll(final Path oldPath, final Path newPath)<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throws IOException {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    if (!this.listeners.isEmpty()) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      for (WALActionsListener i : this.listeners) {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        i.postLogRoll(oldPath, newPath);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span><a name="line.566"></a>
+<span class="sourceLineNo">567</span>    coprocessorHost.postWALRoll(oldPath, newPath);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  // public only until class moves to o.a.h.h.wal<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  /** @return the number of rolled log files */<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  public int getNumRolledLogFiles() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return walFile2Props.size();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // public only until class moves to o.a.h.h.wal<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  /** @return the number of log files in use */<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  public int getNumLogFiles() {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    // +1 for current use log<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    return getNumRolledLogFiles() + 1;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>  /**<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * If the number of un-archived WAL files is greater than maximum allowed, check the first<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * (oldest) WAL file, and returns those regions which should be flushed so that it can be<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * archived.<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * @return regions (encodedRegionNames) to flush in order to archive oldest WAL file.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
+<span class="sourceLineNo">589</span>  byte[][] findRegionsToForceFlush() throws IOException {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    byte[][] regions = null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    int logCount = getNumRolledLogFiles();<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    if (logCount &gt; this.maxLogs &amp;&amp; logCount &gt; 0) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      Map.Entry&lt;Path, WalProps&gt; firstWALEntry = this.walFile2Props.firstEntry();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      regions =<a name="line.594"></a>
+<span class="sourceLineNo">595</span>        this.sequenceIdAccounting.findLower(firstWALEntry.getValue().encodedName2HighestSequenceId);<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    }<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    if (regions != null) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      StringBuilder sb = new StringBuilder();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      for (int i = 0; i &lt; regions.length; i++) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        if (i &gt; 0) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          sb.append(", ");<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        sb.append(Bytes.toStringBinary(regions[i]));<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      LOG.info("Too many WALs; count=" + logCount + ", max=" + this.maxLogs +<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        "; forcing flush of " + regions.length + " regions(s): " + sb.toString());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    return regions;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>  private void cleanOldLogs() throws IOException {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    List&lt;Pair&lt;Path, Long&gt;&gt; logsToArchive = null;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    // For each log file, look at its Map of regions to highest sequence id; if all sequence ids<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    // are older than what is currently in memory, the WAL can be GC'd.<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    for (Map.Entry&lt;Path, WalProps&gt; e : this.walFile2Props.entrySet()) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      Path log = e.getKey();<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      Map&lt;byte[], Long&gt; sequenceNums = e.getValue().encodedName2HighestSequenceId;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      if (this.sequenceIdAccounting.areAllLower(sequenceNums)) {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        if (logsToArchive == null) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>          logsToArchive = new ArrayList&lt;&gt;();<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        logsToArchive.add(Pair.newPair(log, e.getValue().logSize));<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        if (LOG.isTraceEnabled()) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>          LOG.trace("WAL file ready for archiving " + log);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      }<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    if (logsToArchive != null) {<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      for (Pair&lt;Path, Long&gt; logAndSize : logsToArchive) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        this.totalLogSize.addAndGet(-logAndSize.getSecond());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        archiveLogFile(logAndSize.getFirst());<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        this.walFile2Props.remove(logAndSize.getFirst());<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  /*<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * only public so WALSplitter can use.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @return archived location of a WAL file with the given path p<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public static Path getWALArchivePath(Path archiveDir, Path p) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    return new Path(archiveDir, p.getName());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>  }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>  private void archiveLogFile(final Path p) throws IOException {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Path newPath = getWALArchivePath(this.walArchiveDir, p);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    // Tell our listeners that a log is going to be archived.<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    if (!this.listeners.isEmpty()) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      for (WALActionsListener i : this.listeners) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        i.preLogArchive(p, newPath);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    LOG.info("Archiving " + p + " to " + newPath);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    if (!CommonFSUtils.renameAndSetModifyTime(this.fs, p, newPath)) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      throw new IOException("Unable to rename " + p + " to " + newPath);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    // Tell our listeners that a log has been archived.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    if (!this.listeners.isEmpty()) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      for (WALActionsListener i : this.listeners) {<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        i.postLogArchive(p, newPath);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      }<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    }<a name="line.665"></a>
+<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>  protected final void logRollAndSetupWalProps(Path oldPath, Path newPath, long oldFileLen) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    int oldNumEntries = this.numEntries.getAndSet(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    String newPathString = newPath != null ? CommonFSUtils.getPath(newPath) : null;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    if (oldPath != null) {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      this.walFile2Props.put(oldPath,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        new WalProps(this.sequenceIdAccounting.resetHighest(), oldFileLen));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      this.totalLogSize.addAndGet(oldFileLen);<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      LOG.info("Rolled WAL {} with entries={}, filesize={}; new WAL {}",<a name="line.675"></a>
+<span class="sourceLineNo">676</span>        CommonFSUtils.getPath(oldPath), oldNumEntries, StringUtils.byteDesc(oldFileLen),<a name="line.676"></a>
+<span class="sourceLineNo">677</span>        newPathString);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    } else {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      LOG.info("New WAL {}", newPathString);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * &lt;p&gt;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   * Cleans up current writer closing it and then puts in place the passed in<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * &lt;code&gt;nextWriter&lt;/code&gt;.<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * &lt;/p&gt;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * &lt;p&gt;<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * &lt;ul&gt;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   * &lt;li&gt;In the case of creating a new WAL, oldPath will be null.&lt;/li&gt;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * &lt;li&gt;In the case of rolling over from one file to the next, none of the parameters will be null.<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   * &lt;/li&gt;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   * &lt;li&gt;In the case of closing out this FSHLog with no further use newPath and nextWriter will be<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * null.&lt;/li&gt;<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * &lt;/ul&gt;<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * &lt;/p&gt;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param oldPath may be null<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * @param newPath may be null<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   * @param nextWriter may be null<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   * @return the passed in &lt;code&gt;newPath&lt;/code&gt;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   * @throws IOException if there is a problem flushing or closing the underlying FS<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   */<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  @VisibleForTesting<a name="line.703"></a>
+<span class="sourceLineNo">704</span>  Path replaceWriter(Path oldPath, Path newPath, W nextWriter) throws IOException {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    try (TraceScope scope = TraceUtil.createTrace("FSHFile.replaceWriter")) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      doReplaceWriter(oldPath, newPath, nextWriter);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      return newPath;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  protected final void blockOnSync(SyncFuture syncFuture) throws IOException {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    // Now we have published the ringbuffer, halt the current thread until we get an answer back.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    try {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      if (syncFuture != null) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        if (closed) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          throw new IOException("WAL has been closed");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        } else {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          syncFuture.get(walSyncTimeoutNs);<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    } catch (TimeoutIOException tioe) {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      // SyncFuture reuse by thread, if TimeoutIOException happens, ringbuffer<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      // still refer to it, so if this thread use it next time may get a wrong<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      // result.<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      this.cachedSyncFutures.remove();<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      throw tioe;<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    } catch (InterruptedException ie) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      LOG.warn("Interrupted", ie);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      throw convertInterruptedExceptionToIOException(ie);<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    } catch (ExecutionException e) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      throw ensureIOException(e.getCause());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>  private static IOException ensureIOException(final Throwable t) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    return (t instanceof IOException) ? (IOException) t : new IOException(t);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  }<a name="line.737"></a>
+<span class="sourceLineNo">738</span><a name="line.738"></a>
+<span class="sourceLineNo">739</span>  private IOException convertInterruptedExceptionToIOException(final InterruptedException ie) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Thread.currentThread().interrupt();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    IOException ioe = new InterruptedIOException();<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    ioe.initCause(ie);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    return ioe;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  }<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>  @Override<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  public byte[][] rollWriter(boolean force) throws FailedLogCloseException, IOException {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    rollWriterLock.lock();<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    try {<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (this.closed) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        throw new WALClosedException("WAL has been closed");<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      // Return if nothing to flush.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (!force &amp;&amp; this.writer != null &amp;&amp; this.numEntries.get() &lt;= 0) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        return null;<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>      byte[][] regionsToFlush = null;<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      try (TraceScope scope = TraceUtil.createTrace("FSHLog.rollWriter")) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        Path oldPath = getOldPath();<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        Path newPath = getNewPath();<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        // Any exception from here on is catastrophic, non-recoverable so we currently abort.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        W nextWriter = this.createWriterInstance(newPath);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        tellListenersAboutPreLogRoll(oldPath, newPath);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>        // NewPath could be equal to oldPath if replaceWriter fails.<a name="line.764"></a>
+<span class="sourceLineNo">765</span>        newPath = replaceWriter(oldPath, newPath, nextWriter);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        tellListenersAboutPostLogRoll(oldPath, newPath);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>        if (LOG.isDebugEnabled()) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>          LOG.debug("Create new " + implClassName + " writer with pipeline: " +<a name="line.768"></a>
+<span class="sourceLineNo">769</span>            Arrays.toString(getPipeline()));<a name="line.769"></a>
+<span class="sourceLineNo">770</span>        }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        // Can we delete any of the old log files?<a name="line.771"></a>
+<span class="sourceLineNo">772</span>        if (getNumRolledLogFiles() &gt; 0) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>          cleanOldLogs();<a name="line.773"></a>
+<span class="sourceLineNo">774</span>          regionsToFlush = findRegionsToForceFlush();<a name="line.774"></a>
 <span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        // Can we delete any of the old log files?<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (getNumRolledLogFiles() &gt; 0) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          cleanOldLogs();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>          regionsToFlush = findRegionsToForceFlush();<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        // If the underlying FileSystem can't do what we ask, treat as IO failure so<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        // we'll abort.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        throw new IOException(<a name="line.784"></a>
-<span class="sourceLineNo">785</span>            "Underlying FileSystem can't meet stream requirements. See RS log " + "for details.",<a name="line.785"></a>
-<span class="sourceLineNo">786</span>            exception);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      }<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      return regionsToFlush;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    } finally {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      rollWriterLock.unlock();<a name="line.790"></a>
-<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  }<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>  // public only until class moves to o.a.h.h.wal<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  /** @return the size of log files in use */<a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public long getLogFileSize() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    return this.totalLogSize.get();<a name="line.797"></a>
+<span class="sourceLineNo">776</span>      } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        // If the underlying FileSystem can't do what we ask, treat as IO failure so<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        // we'll abort.<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        throw new IOException(<a name="line.779"></a>
+<span class="sourceLineNo">780</span>            "Underlying FileSystem can't meet stream requirements. See RS log " + "for details.",<a name="line.780"></a>
+<span class="sourceLineNo">781</span>            exception);<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      return regionsToFlush;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      rollWriterLock.unlock();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    }<a name="line.786"></a>
+<span class="sourceLineNo">787</span>  }<a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>  // public only until class moves to o.a.h.h.wal<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  /** @return the size of log files in use */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public long getLogFileSize() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return this.totalLogSize.get();<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  }<a name="line.793"></a>
+<span class="sourceLineNo">794</span><a name="line.794"></a>
+<span class="sourceLineNo">795</span>  // public only until class moves to o.a.h.h.wal<a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public void requestLogRoll() {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    requestLogRoll(false);<a name="line.797"></a>
 <span class="sourceLineNo">798</span>  }<a name="line.798"></a>
 <span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>  // public only until class moves to o.a.h.h.wal<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  public void requestLogRoll() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    requestLogRoll(false);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the backing files associated with this WAL.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   * @return may be null if there are no files.<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   */<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  @VisibleForTesting<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  FileStatus[] getFiles() throws IOException {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return CommonFSUtils.listStatus(fs, walDir, ourFiles);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void shutdown() throws IOException {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    if (!shutdown.compareAndSet(false, true)) {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      return;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    closed = true;<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    // Tell our listeners that the log is closing<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    if (!this.listeners.isEmpty()) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      for (WALActionsListener i : this.listeners) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        i.logCloseRequested();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    rollWriterLock.lock();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    try {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      doShutdown();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>    } finally {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      rollWriterLock.unlock();<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    }<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  @Override<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  public void close() throws IOException {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    shutdown();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final FileStatus[] files = getFiles();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    if (null != files &amp;&amp; 0 != files.length) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      for (FileStatus file : files) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        Path p = getWALArchivePath(this.walArchiveDir, file.getPath());<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        // Tell our listeners that a log is going to be archived.<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        if (!this.listeners.isEmpty()) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>          for (WALActionsListener i : this.listeners) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>            i.preLogArchive(file.getPath(), p);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>        }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>        if (!CommonFSUtils.renameAndSetModifyTime(fs, file.getPath(), p)) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          throw new IOException("Unable to rename " + file.getPath() + " to " + p);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        // Tell our listeners that a log was archived.<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        if (!this.listeners.isEmpty()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          for (WALActionsListener i : this.listeners) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>            i.postLogArchive(file.getPath(), p);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      LOG.debug(<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        "Moved " + files.length + " WAL file(s) to " + CommonFSUtils.getPath(this.walArchiveDir));<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    LOG.info("Closed WAL: " + toString());<a name="line.861"></a>
-<span class="sourceLineNo">862</span>  }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span>  /**<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * updates the sequence number of a specific store. depending on the flag: replaces current seq<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * number if the given seq id is bigger, or even if it is lower than existing one<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * @param encodedRegionName<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * @param familyName<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * @param sequenceid<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * @param onlyIfGreater<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   */<a name="line.871"></a>
-<span class="sourceLineNo">872</span>  @Override<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  public void updateStore(byte[] encodedRegionName, byte[] familyName, Long sequenceid,<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      boolean onlyIfGreater) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    sequenceIdAccounting.updateStore(encodedRegionName, familyName, sequenceid, onlyIfGreater);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
-<span class="sourceLineNo">877</span><a name="line.877"></a>
-<span class="sourceLineNo">878</span>  protected final SyncFuture getSyncFuture(long sequence) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    return cachedSyncFutures.get().reset(sequence);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>  protected final void requestLogRoll(boolean tooFewReplicas) {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (!this.listeners.isEmpty()) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      for (WALActionsListener i : this.listeners) {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>        i.logRollRequested(tooFewReplicas);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      }<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>  long getUnflushedEntriesCount() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    long highestSynced = this.highestSyncedTxid.get();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    long highestUnsynced = this.highestUnsyncedTxid;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return highestSynced &gt;= highestUnsynced ? 0 : highestUnsynced - highestSynced;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  boolean isUnflushedEntries() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    return getUnflushedEntriesCount() &gt; 0;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Exposed for testing only. Use to tricks like halt the ring buffer appending.<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   */<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  @VisibleForTesting<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  void atHeadOfRingBufferEventHandlerAppend() {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // Noop<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  protected final boolean append(W writer, FSWALEntry entry) throws IOException {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    // TODO: WORK ON MAKING THIS APPEND FASTER. DOING WAY TOO MUCH WORK WITH CPs, PBing, etc.<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    atHeadOfRingBufferEventHandlerAppend();<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    long start = EnvironmentEdgeManager.currentTime();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    byte[] encodedRegionName = entry.getKey().getEncodedRegionName();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    long regionSequenceId = entry.getKey().getSequenceId();<a name="line.913"></a>
-<span class="sourceLineNo">914</span><a name="line.914"></a>
-<span class="sourceLineNo">915</span>    // Edits are empty, there is nothing to append. Maybe empty when we are looking for a<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    // region sequence id only, a region edit/sequence id that is not associated with an actual<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    // edit. It has to go through all the rigmarole to be sure we have the right ordering.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    if (entry.getEdit().isEmpty()) {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      return false;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    }<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // Coprocessor hook.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    coprocessorHost.preWALWrite(entry.getRegionInfo(), entry.getKey(), entry.getEdit());<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    if (!listeners.isEmpty()) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      for (WALActionsListener i : listeners) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        i.visitLogEntryBeforeWrite(entry.getKey(), entry.getEdit());<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    doAppend(writer, entry);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    assert highestUnsyncedTxid &lt; entry.getTxid();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    highestUnsyncedTxid = entry.getTxid();<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    sequenceIdAccounting.update(encodedRegionName, entry.getFamilyNames(), regionSequenceId,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      entry.isInMemStore());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    coprocessorHost.postWALWrite(entry.getRegionInfo(), entry.getKey(), entry.getEdit());<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    // Update metrics.<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    postAppend(entry, EnvironmentEdgeManager.currentTime() - start);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    numEntries.incrementAndGet();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>  }<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>  private long postAppend(final Entry e, final long elapsedTime) throws IOException {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    long len = 0;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    if (!listeners.isEmpty()) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      for (Cell cell : e.getEdit().getCells()) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        len += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.945"></a>
-<span class="sourceLineNo">946</span>      }<a name="l

<TRUNCATED>

[36/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
index 721035e..f808b16 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.MasterStoppedException.html
@@ -169,3778 +169,3785 @@
 <span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.161"></a>
 <span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.quotas.MasterQuotasObserver;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.quotas.QuotaObserverChore;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.regionserver.RSRpcServices;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.replication.ReplicationLoadSource;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
-<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
-<span class="sourceLineNo">242</span> *<a name="line.242"></a>
-<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> *<a name="line.246"></a>
-<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
-<span class="sourceLineNo">248</span> *<a name="line.248"></a>
-<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
-<span class="sourceLineNo">250</span> */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
-<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<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>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.setDaemon(true);<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>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  //Tracker for master maintenance mode setting<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  private ClusterSchemaService clusterSchemaService;<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    "hbase.master.wait.on.service.seconds";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  // Metrics for the HMaster<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  final MetricsMaster metricsMaster;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // file system manager for the master FS operations<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private MasterFileSystem fileSystemManager;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterWalManager walManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // server manager to deal with region server info<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private volatile ServerManager serverManager;<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // manager of assignment nodes in zookeeper<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private AssignmentManager assignmentManager;<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  // manager of replication<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  // buffer for "fatal error" notices from region servers<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // in the cluster. This is only used for assisting<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // operations/debugging.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // flag set after we become the active master (used for testing)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private volatile boolean activeMaster = false;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  // flag set after we complete initialization once active<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  // flag set after master services are started,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // initialization may have not completed yet.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  volatile boolean serviceStarted = false;<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Maximum time we should run balancer for<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  private final int maxBlancingTime;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Maximum percent of regions in transition when balancing<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  private final double maxRitPercent;<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private final LockManager lockManager = new LockManager(this);<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private LoadBalancer balancer;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private RegionNormalizer normalizer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private BalancerChore balancerChore;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private RegionNormalizerChore normalizerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private ClusterStatusChore clusterStatusChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  CatalogJanitor catalogJanitorChore;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private LogCleaner logCleaner;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private HFileCleaner hfileCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private MobCompactionChore mobCompactChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // used to synchronize the mobCompactionStates<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // save the information of mob compactions in tables.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  MasterCoprocessorHost cpHost;<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  private final boolean preLoadTableDescriptors;<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // Time stamps for when a hmaster became active<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  private long masterActiveTime;<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  private long masterFinishedInitializationTime;<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private final boolean masterCheckCompression;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  //should we check encryption settings at master side, default true<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private final boolean masterCheckEncryption;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // monitor for snapshot of hbase tables<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  SnapshotManager snapshotManager;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // monitor for distributed procedures<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private MasterProcedureManagerHost mpmHost;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  private volatile MasterQuotaManager quotaManager;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private QuotaObserverChore quotaObserverChore;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private WALProcedureStore procedureStore;<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // handle table states<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private TableStateManager tableStateManager;<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private long splitPlanCount;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long mergePlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /* Handle favored nodes information */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  private FavoredNodesManager favoredNodesManager;<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private Server masterJettyServer;<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public static class RedirectServlet extends HttpServlet {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private final int regionServerInfoPort;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final String regionServerHostname;<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>     * @param infoServer that we're trying to send all requests to<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     */<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       regionServerInfoPort = infoServer.getPort();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerHostname = hostname;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    public void doGet(HttpServletRequest request,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      String redirectHost = regionServerHostname;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      if(redirectHost == null) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        redirectHost = request.getServerName();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "to an appropriate hostname.");<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          return;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      String redirectUrl = request.getScheme() + "://"<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + request.getRequestURI();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      response.sendRedirect(redirectUrl);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Initializes the HMaster. The steps are as follows:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * &lt;p&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;ol&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;/ol&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;p&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * Remaining steps of initialization occur in<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * the master becomes the active one.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public HMaster(final Configuration conf)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throws IOException, KeeperException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    super(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    TraceUtil.initTracer(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      // Disable usage of meta replicas in the master<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>      decorateMasterConfiguration(this.conf);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>      // should we check encryption settings at master side, default true<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // preload table descriptor at startup<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Do we publish the status?<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.538"></a>
-<span class="sourceLineNo">539</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.Publisher.class);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (shouldPublish) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        if (publisherClass == null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              " is not set - not publishing status");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        } else {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        }<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>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      } else {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        this.activeMasterManager = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    } catch (Throwable t) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // cause of failed startup is lost.<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      LOG.error("Failed construction of Master", t);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw t;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  @Override<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // block in here until then.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  @Override<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void run() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            int infoPort = putUpJettyServer();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            startActiveMasterManager(infoPort);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          } catch (Throwable t) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            // Make sure we log the exception.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            String error = "Failed to become Active Master";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            LOG.error(error, t);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            // Abort should have been called already.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            if (!isAborted()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              abort(error, t);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }), getName() + ":becomeActiveMaster");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // the super run call will do this for us.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      super.run();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    } finally {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      if (this.clusterSchemaService != null) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>        // If on way out, then we are no longer active master.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        this.clusterSchemaService.stopAsync();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          this.clusterSchemaService.awaitTerminated(<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (TimeoutException te) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      this.activeMaster = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  // return the actual infoPort, -1 means disable info server.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  private int putUpJettyServer() throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return -1;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // -1 is for disabling info server, so no redirecting<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return -1;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if(infoPort == infoServer.getPort()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      return infoPort;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      String msg =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.629"></a>
-<span class="sourceLineNo">630</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + "hbase.master.info.bindAddress";<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      LOG.error(msg);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      throw new IOException(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // a second entire stack here.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    masterJettyServer = new Server();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    connector.setHost(addr);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setPort(infoPort);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    masterJettyServer.addConnector(connector);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final String redirectHostname =<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.setServer(masterJettyServer);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    try {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      masterJettyServer.start();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } catch (Exception e) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return connector.getLocalPort();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  @Override<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      super.login(user, host);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    } catch (IOException ie) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      user.login("hbase.master.keytab.file",<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        "hbase.master.kerberos.principal", host);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * If configured to put regions on active master,<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * wait till a backup master becomes active.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Override<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  protected void waitForMasterActive(){<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      sleeper.sleep();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  @VisibleForTesting<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return (MasterRpcServices)rpcServices;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Override<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  protected String getProcessName() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return MASTER;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  protected boolean canCreateBaseZNode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return true;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  protected boolean canUpdateTableDescriptor() {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    return true;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  @Override<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    return new MasterRpcServices(this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void configureInfoServer() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    infoServer.addServlet("master-status", "/master-status", MasterStatusServlet.class);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    infoServer.setAttribute(MASTER, this);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    if (LoadBalancer.isTablesOnMaster(conf)) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      super.configureInfoServer();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return MasterDumpServlet.class;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public MetricsMaster getMasterMetrics() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return metricsMaster;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * &lt;p&gt;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * Initialize all ZK based system trackers. But do not include {@link RegionServerTracker}, it<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * should have already been initialized along with {@link ServerManager}.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * &lt;/p&gt;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * &lt;p&gt;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   * Will be overridden in tests.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>   * &lt;/p&gt;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   */<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  @VisibleForTesting<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  protected void initializeZKBasedSystemTrackers()<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      throws IOException, InterruptedException, KeeperException, ReplicationException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    this.balancer = LoadBalancerFactory.getLoadBalancer(conf);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    this.normalizer.setMasterServices(this);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    this.loadBalancerTracker = new LoadBalancerTracker(zooKeeper, this);<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    this.loadBalancerTracker.start();<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    this.regionNormalizerTracker = new RegionNormalizerTracker(zooKeeper, this);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    this.regionNormalizerTracker.start();<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    this.splitOrMergeTracker = new SplitOrMergeTracker(zooKeeper, conf, this);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    this.splitOrMergeTracker.start();<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    this.replicationPeerManager = ReplicationPeerManager.create(zooKeeper, conf);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    this.syncReplicationReplayWALManager = new SyncReplicationReplayWALManager(this);<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    this.drainingServerTracker = new DrainingServerTracker(zooKeeper, this, this.serverManager);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    this.drainingServerTracker.start();<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>    this.maintenanceModeTracker = new MasterMaintenanceModeTracker(zooKeeper);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    this.maintenanceModeTracker.start();<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    String clientQuorumServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    boolean clientZkObserverMode = conf.getBoolean(HConstants.CLIENT_ZOOKEEPER_OBSERVER_MODE,<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      HConstants.DEFAULT_CLIENT_ZOOKEEPER_OBSERVER_MODE);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (clientQuorumServers != null &amp;&amp; !clientZkObserverMode) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      // we need to take care of the ZK information synchronization<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      // if given client ZK are not observer nodes<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      ZKWatcher clientZkWatcher = new ZKWatcher(conf,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          getProcessName() + ":" + rpcServices.getSocketAddress().getPort() + "-clientZK", this,<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          false, true);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      this.metaLocationSyncer = new MetaLocationSyncer(zooKeeper, clientZkWatcher, this);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.metaLocationSyncer.start();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      this.masterAddressSyncer = new MasterAddressSyncer(zooKeeper, clientZkWatcher, this);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.masterAddressSyncer.start();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      // set cluster id is a one-go effort<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      ZKClusterId.setClusterId(clientZkWatcher, fileSystemManager.getClusterId());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Set the cluster as up.  If new RSs, they'll be waiting on this before<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // going ahead with their startup.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    boolean wasUp = this.clusterStatusTracker.isClusterUp();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    if (!wasUp) this.clusterStatusTracker.setClusterUp();<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    LOG.info("Active/primary master=" + this.serverName +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        ", sessionid=0x" +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()) +<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        ", setting cluster-up flag (Was=" + wasUp + ")");<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>    // create/initialize the snapshot manager and other procedure managers<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    this.snapshotManager = new SnapshotManager();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    this.mpmHost = new MasterProcedureManagerHost();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    this.mpmHost.register(this.snapshotManager);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    this.mpmHost.register(new MasterFlushTableProcedureManager());<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.mpmHost.loadProcedures(conf);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    this.mpmHost.initialize(this, this.metricsMaster);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  private static final ImmutableSet&lt;Class&lt;?&gt;&gt; UNSUPPORTED_PROCEDURES =<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ImmutableSet.of(RecoverMetaProcedure.class, AssignProcedure.class, UnassignProcedure.class,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      MoveRegionProcedure.class);<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * make sure that there are none these procedures when upgrading. If there are, the master will<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * quit, you need to go back to the old version to finish these procedures first before upgrading.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   */<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  private void checkUnsupportedProcedure(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType)<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throws HBaseIOException {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    // Confirm that we do not have unfinished assign/unassign related procedures. It is not easy to<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    // support both the old assign/unassign procedures and the new TransitRegionStateProcedure as<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    // there will be conflict in the code for AM. We should finish all these procedures before<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    // upgrading.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    for (Class&lt;?&gt; clazz : UNSUPPORTED_PROCEDURES) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt; procs = procsByType.get(clazz);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      if (procs != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        LOG.error(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          "Unsupported procedure type {} found, please rollback your master to the old" +<a name="line.831"></a>
-<span class="sourceLineNo">832</span>            " version to finish them, and then try to upgrade again. The full procedure list: {}",<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          clazz, procs);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        throw new HBaseIOException("Unsupported procedure type " + clazz + " found");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // A special check for SCP, as we do not support RecoverMetaProcedure any more so we need to<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    // make sure that no one will try to schedule it but SCP does have a state which will schedule<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    // it.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    if (procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      .map(p -&gt; (ServerCrashProcedure) p).anyMatch(ServerCrashProcedure::isInRecoverMetaState)) {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      LOG.error("At least one ServerCrashProcedure is going to schedule a RecoverMetaProcedure," +<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        " which is not supported any more. Please rollback your master to the old version to" +<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        " finish them, and then try to upgrade again.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      throw new HBaseIOException("Unsupported procedure state found for ServerCrashProcedure");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  // Will be overriden in test to inject customized AssignmentManager<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  @VisibleForTesting<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected AssignmentManager createAssignmentManager(MasterServices master) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return new AssignmentManager(master);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  /**<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * Finish initialization of HMaster after becoming the primary master.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * &lt;p/&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * The startup order is a bit complicated but very important, do not change it unless you know<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * what you are doing.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   * &lt;ol&gt;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>   * &lt;li&gt;Initialize file system based components - file system manager, wal manager, table<a name="line.861"></a>
-<span class="sourceLineNo">862</span>   * descriptors, etc&lt;/li&gt;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>   * &lt;li&gt;Publish cluster id&lt;/li&gt;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * &lt;li&gt;Here comes the most complicated part - initialize server manager, assignment manager and<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * region server tracker<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * &lt;ol type='i'&gt;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * &lt;li&gt;Create server manager&lt;/li&gt;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * &lt;li&gt;Create procedure executor, load the procedures, but do not start workers. We will start it<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * later after we finish scheduling SCPs to avoid scheduling duplicated SCPs for the same<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * server&lt;/li&gt;<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * &lt;li&gt;Create assignment manager and start it, load the meta region state, but do not load data<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * from meta region&lt;/li&gt;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * &lt;li&gt;Start region server tracker, construct the online servers set and find out dead servers and<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * schedule SCP for them. The online servers will be constructed by scanning zk, and we will also<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * scan the wal directory to find out possible live region servers, and the differences between<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * these two sets are the dead servers&lt;/li&gt;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;/ol&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * &lt;/li&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * &lt;li&gt;If this is a new deploy, schedule a InitMetaProcedure to initialize meta&lt;/li&gt;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * &lt;li&gt;Start necessary service threads - balancer, catalog janior, executor services, and also the<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * procedure executor, etc. Notice that the balancer must be created first as assignment manager<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * may use it when assigning regions.&lt;/li&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * &lt;li&gt;Wait for meta to be initialized if necesssary, start table state manager.&lt;/li&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * &lt;li&gt;Wait for enough region servers to check-in&lt;/li&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * &lt;li&gt;Let assignment manager load data from meta and construct region states&lt;/li&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * &lt;li&gt;Start all other things such as chore services, etc&lt;/li&gt;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   * &lt;/ol&gt;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>   * &lt;p/&gt;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Notice that now we will not schedule a special procedure to make meta online(unless the first<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * time where meta has not been created yet), we will rely on SCP to bring meta online.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  private void finishActiveMasterInitialization(MonitoredTask status) throws IOException,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          InterruptedException, KeeperException, ReplicationException {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    Thread zombieDetector = new Thread(new InitializationMonitor(this),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        "ActiveMasterInitializationMonitor-" + System.currentTimeMillis());<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    zombieDetector.setDaemon(true);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    zombieDetector.start();<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>    /*<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * We are active master now... go initialize components we need to run.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    status.setStatus("Initializing Master file system");<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>    this.masterActiveTime = System.currentTimeMillis();<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // TODO: Do this using Dependency Injection, using PicoContainer, Guice or Spring.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    // Initialize the chunkCreator<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    initializeMemStoreChunkCreator();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    this.fileSystemManager = new MasterFileSystem(conf);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    this.walManager = new MasterWalManager(this);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // enable table descriptors cache<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    this.tableDescriptors.setCacheOn();<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // warm-up HTDs cache on master initialization<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    if (preLoadTableDescriptors) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      status.setStatus("Pre-loading table descriptors");<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      this.tableDescriptors.getAll();<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Publish cluster ID; set it in Master too. The superclass RegionServer does this later but<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    // only after it has checked in with the Master. At least a few tests ask Master for clusterId<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // before it has called its run method and before RegionServer has done the reportForDuty.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    ClusterId clusterId = fileSystemManager.getClusterId();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    status.setStatus("Publishing Cluster ID " + clusterId + " in ZooKeeper");<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    ZKClusterId.setClusterId(this.zooKeeper, fileSystemManager.getClusterId());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    this.clusterId = clusterId.toString();<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // Precaution. Put in place the old hbck1 lock file to fence out old hbase1s running their<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // hbck1s against an hbase2 cluster; it could do damage. To skip this behavior, set<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // hbase.write.hbck1.lock.file to false.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (this.conf.getBoolean("hbase.write.hbck1.lock.file", true)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      HBaseFsck.checkAndMarkRunningHbck(this.conf,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          HBaseFsck.createLockRetryCounterFactory(this.conf).create());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    status.setStatus("Initialize ServerManager and schedule SCP for crash servers");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    this.serverManager = createServerManager(this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    createProcedureExecutor();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    @SuppressWarnings("rawtypes")<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType =<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      procedureExecutor.getActiveProceduresNoCopy().stream()<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        .collect(Collectors.groupingBy(p -&gt; p.getClass()));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>    checkUnsupportedProcedure(procsByType);<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    // Create Assignment Manager<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    this.assignmentManager = createAssignmentManager(this);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    this.assignmentManager.start();<a name="line.948"></a>
-<span class="sourceLineNo">949</span>    // TODO: TRSP can perform as the sub procedure for other procedures, so even if it is marked as<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    // completed, it could still be in the procedure list. This is a bit strange but is another<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    // story, need to verify the implementation for ProcedureExecutor and ProcedureStore.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    List&lt;TransitRegionStateProcedure&gt; ritList =<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      procsByType.getOrDefault(TransitRegionStateProcedure.class, Collections.emptyList()).stream()<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        .filter(p -&gt; !p.isFinished()).map(p -&gt; (TransitRegionStateProcedure) p)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        .collect(Collectors.toList());<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    this.assignmentManager.setupRIT(ritList);<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // Start RegionServerTracker with listing of servers found with exiting SCPs -- these should<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // be registered in the deadServers set -- and with the list of servernames out on the<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    // filesystem that COULD BE 'alive' (we'll schedule SCPs for each and let SCP figure it out).<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    // We also pass dirs that are already 'splitting'... so we can do some checks down in tracker.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // TODO: Generate the splitting and live Set in one pass instead of two as we currently do.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    this.regionServerTracker = new RegionServerTracker(zooKeeper, this, this.serverManager);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    this.regionServerTracker.start(<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        .map(p -&gt; (ServerCrashProcedure) p).map(p -&gt; p.getServerName()).collect(Collectors.toSet()),<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      walManager.getLiveServersFromWALDir(), walManager.getSplittingServersFromWALDir());<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    // This manager will be started AFTER hbase:meta is confirmed on line.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    // hbase.mirror.table.state.to.zookeeper is so hbase1 clients can connect. They read table<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    // state from zookeeper while hbase2 reads it from hbase:meta. Disable if no hbase1 clients.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    this.tableStateManager =<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY, true)<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        ?<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        new MirroringTableStateManager(this):<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        new TableStateManager(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    status.setStatus("Initializing ZK system trackers");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    initializeZKBasedSystemTrackers();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    status.setStatus("Loading last flushed sequence id of regions");<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    try {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    } catch (IOException e) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          + " from file system", e);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    this.activeMaster = true;<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>    // This is for backwards compatibility<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // See HBASE-11393<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    status.setStatus("Update TableCFs node in ZNode");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    ReplicationPeerConfigUpgrader tableCFsUpdater =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        new ReplicationPeerConfigUpgrader(z

<TRUNCATED>

[21/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
index ff29160..e4dc134 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
@@ -42,190 +42,208 @@
 <span class="sourceLineNo">034</span>public interface ProcedureStore {<a name="line.34"></a>
 <span class="sourceLineNo">035</span>  /**<a name="line.35"></a>
 <span class="sourceLineNo">036</span>   * Store listener interface.<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   * The main process should register a listener and respond to the store events.<a name="line.37"></a>
-<span class="sourceLineNo">038</span>   */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public interface ProcedureStoreListener {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>     * triggered when the store sync is completed.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>     */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    void postSync();<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>     * triggered when the store is not able to write out data.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>     * the main process should abort.<a name="line.47"></a>
-<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    void abortProcess();<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  }<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>   * An Iterator over a collection of Procedure<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public interface ProcedureIterator {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    /**<a name="line.56"></a>
-<span class="sourceLineNo">057</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>     */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    void reset();<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>     * Returns true if the iterator has more elements.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>     * (In other words, returns true if next() would return a Procedure<a name="line.63"></a>
-<span class="sourceLineNo">064</span>     * rather than throwing an exception.)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>     * @return true if the iterator has more procedures<a name="line.65"></a>
-<span class="sourceLineNo">066</span>     */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    boolean hasNext();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>     * @return true if the iterator next element is a completed procedure.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>     */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    boolean isNextFinished();<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">037</span>   * &lt;p/&gt;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * The main process should register a listener and respond to the store events.<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public interface ProcedureStoreListener {<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>     * triggered when the store sync is completed.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>     */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    default void postSync() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>    /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>     * triggered when the store is not able to write out data. the main process should abort.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>     */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    default void abortProcess() {<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>    /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>     * Suggest that the upper layer should update the state of some procedures. Ignore this call<a name="line.55"></a>
+<span class="sourceLineNo">056</span>     * will not effect correctness but performance.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>     * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>     * For a WAL based ProcedureStore implementation, if all the procedures stored in a WAL file<a name="line.58"></a>
+<span class="sourceLineNo">059</span>     * have been deleted, or updated later in another WAL file, then we can delete the WAL file. If<a name="line.59"></a>
+<span class="sourceLineNo">060</span>     * there are old procedures in a WAL file which are never deleted or updated, then we can not<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * delete the WAL file and this will cause we hold lots of WAL file and slow down the master<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     * restarts. So here we introduce this method to tell the upper layer that please update the<a name="line.62"></a>
+<span class="sourceLineNo">063</span>     * states of these procedures so that we can delete the old WAL file.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>     * @param procIds the id for the procedures<a name="line.64"></a>
+<span class="sourceLineNo">065</span>     */<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    default void forceUpdate(long[] procIds) {<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><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * An Iterator over a collection of Procedure<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public interface ProcedureIterator {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>     * Skip the next procedure<a name="line.75"></a>
+<span class="sourceLineNo">075</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.75"></a>
 <span class="sourceLineNo">076</span>     */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    void skipNext();<a name="line.77"></a>
+<span class="sourceLineNo">077</span>    void reset();<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
 <span class="sourceLineNo">079</span>    /**<a name="line.79"></a>
-<span class="sourceLineNo">080</span>     * Returns the next procedure in the iteration.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.81"></a>
-<span class="sourceLineNo">082</span>     * @return the next procedure in the iteration.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    @SuppressWarnings("rawtypes")<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    Procedure next() throws IOException;<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>  /**<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public interface ProcedureLoader {<a name="line.91"></a>
+<span class="sourceLineNo">080</span>     * Returns true if the iterator has more elements.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>     * (In other words, returns true if next() would return a Procedure<a name="line.81"></a>
+<span class="sourceLineNo">082</span>     * rather than throwing an exception.)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>     * @return true if the iterator has more procedures<a name="line.83"></a>
+<span class="sourceLineNo">084</span>     */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    boolean hasNext();<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>     * @return true if the iterator next element is a completed procedure.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    boolean isNextFinished();<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>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @param maxProcId the highest proc-id in the store<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.106"></a>
-<span class="sourceLineNo">107</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Add the listener to the notification list.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param listener The AssignmentListener to register<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param listener The AssignmentListener to unregister<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  boolean unregisterListener(ProcedureStoreListener listener);<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * Start/Open the procedure store<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * @param numThreads<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param abort true if the stop is an abort<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  void stop(boolean abort);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return true if the store is running, otherwise false.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  int getNumThreads();<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>   * Set the number of procedure running.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.162"></a>
+<span class="sourceLineNo">093</span>     * Skip the next procedure<a name="line.93"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    void skipNext();<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>     * Returns the next procedure in the iteration.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.99"></a>
+<span class="sourceLineNo">100</span>     * @return the next procedure in the iteration.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>     */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @SuppressWarnings("rawtypes")<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    Procedure next() throws IOException;<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>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public interface ProcedureLoader {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    /**<a name="line.110"></a>
+<span class="sourceLineNo">111</span>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>     * @param maxProcId the highest proc-id in the store<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>     */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.124"></a>
+<span class="sourceLineNo">125</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.126"></a>
+<span class="sourceLineNo">127</span>     */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * Add the listener to the notification list.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param listener The AssignmentListener to register<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param listener The AssignmentListener to unregister<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  boolean unregisterListener(ProcedureStoreListener listener);<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>   * Start/Open the procedure store<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param numThreads<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param abort true if the stop is an abort<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  void stop(boolean abort);<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>   * @return true if the store is running, otherwise false.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.162"></a>
 <span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  void load(ProcedureLoader loader) throws IOException;<a name="line.164"></a>
+<span class="sourceLineNo">164</span>  int getNumThreads();<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param proc the procedure to serialize and write to the store.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param subprocs the newly created child of the proc.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param procs the procedures to serialize and write to the store.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  void insert(Procedure&lt;?&gt;[] procs);<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>   * The specified procedure was executed,<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * and the new state should be written to the store.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param proc the procedure to serialize and write to the store.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  void update(Procedure&lt;?&gt; proc);<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>   * The specified procId was removed from the executor,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * due to completion, abort or failure.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * The store implementor should remove all the information about the specified procId.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @param procId the ID of the procedure to remove.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  void delete(long procId);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * The parent procedure completed.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Update the state and mark all the child deleted.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /**<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * The specified procIds were removed from the executor,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * due to completion, abort or failure.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @param procIds the IDs of the procedures to remove.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param offset the array offset from where to start to delete<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @param count the number of IDs to delete<a name="line.217"></a>
+<span class="sourceLineNo">167</span>   * Set the number of procedure running.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  void load(ProcedureLoader loader) throws IOException;<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   *<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param proc the procedure to serialize and write to the store.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param subprocs the newly created child of the proc.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @param procs the procedures to serialize and write to the store.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  void insert(Procedure&lt;?&gt;[] procs);<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * The specified procedure was executed,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * and the new state should be written to the store.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param proc the procedure to serialize and write to the store.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  void update(Procedure&lt;?&gt; proc);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * The specified procId was removed from the executor,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * due to completion, abort or failure.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * The store implementor should remove all the information about the specified procId.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param procId the ID of the procedure to remove.<a name="line.217"></a>
 <span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  void delete(long[] procIds, int offset, int count);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>}<a name="line.220"></a>
+<span class="sourceLineNo">219</span>  void delete(long procId);<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>   * The parent procedure completed.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Update the state and mark all the child deleted.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<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>   * The specified procIds were removed from the executor,<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * due to completion, abort or failure.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param procIds the IDs of the procedures to remove.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param offset the array offset from where to start to delete<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param count the number of IDs to delete<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  void delete(long[] procIds, int offset, int count);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>}<a name="line.238"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
index ff29160..e4dc134 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureLoader.html
@@ -42,190 +42,208 @@
 <span class="sourceLineNo">034</span>public interface ProcedureStore {<a name="line.34"></a>
 <span class="sourceLineNo">035</span>  /**<a name="line.35"></a>
 <span class="sourceLineNo">036</span>   * Store listener interface.<a name="line.36"></a>
-<span class="sourceLineNo">037</span>   * The main process should register a listener and respond to the store events.<a name="line.37"></a>
-<span class="sourceLineNo">038</span>   */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public interface ProcedureStoreListener {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    /**<a name="line.40"></a>
-<span class="sourceLineNo">041</span>     * triggered when the store sync is completed.<a name="line.41"></a>
-<span class="sourceLineNo">042</span>     */<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    void postSync();<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>     * triggered when the store is not able to write out data.<a name="line.46"></a>
-<span class="sourceLineNo">047</span>     * the main process should abort.<a name="line.47"></a>
-<span class="sourceLineNo">048</span>     */<a name="line.48"></a>
-<span class="sourceLineNo">049</span>    void abortProcess();<a name="line.49"></a>
-<span class="sourceLineNo">050</span>  }<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>   * An Iterator over a collection of Procedure<a name="line.53"></a>
-<span class="sourceLineNo">054</span>   */<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  public interface ProcedureIterator {<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    /**<a name="line.56"></a>
-<span class="sourceLineNo">057</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.57"></a>
-<span class="sourceLineNo">058</span>     */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    void reset();<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>     * Returns true if the iterator has more elements.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>     * (In other words, returns true if next() would return a Procedure<a name="line.63"></a>
-<span class="sourceLineNo">064</span>     * rather than throwing an exception.)<a name="line.64"></a>
-<span class="sourceLineNo">065</span>     * @return true if the iterator has more procedures<a name="line.65"></a>
-<span class="sourceLineNo">066</span>     */<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    boolean hasNext();<a name="line.67"></a>
-<span class="sourceLineNo">068</span><a name="line.68"></a>
-<span class="sourceLineNo">069</span>    /**<a name="line.69"></a>
-<span class="sourceLineNo">070</span>     * @return true if the iterator next element is a completed procedure.<a name="line.70"></a>
-<span class="sourceLineNo">071</span>     */<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    boolean isNextFinished();<a name="line.72"></a>
-<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">037</span>   * &lt;p/&gt;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>   * The main process should register a listener and respond to the store events.<a name="line.38"></a>
+<span class="sourceLineNo">039</span>   */<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public interface ProcedureStoreListener {<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>     * triggered when the store sync is completed.<a name="line.43"></a>
+<span class="sourceLineNo">044</span>     */<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    default void postSync() {<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>    /**<a name="line.48"></a>
+<span class="sourceLineNo">049</span>     * triggered when the store is not able to write out data. the main process should abort.<a name="line.49"></a>
+<span class="sourceLineNo">050</span>     */<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    default void abortProcess() {<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>    /**<a name="line.54"></a>
+<span class="sourceLineNo">055</span>     * Suggest that the upper layer should update the state of some procedures. Ignore this call<a name="line.55"></a>
+<span class="sourceLineNo">056</span>     * will not effect correctness but performance.<a name="line.56"></a>
+<span class="sourceLineNo">057</span>     * &lt;p/&gt;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>     * For a WAL based ProcedureStore implementation, if all the procedures stored in a WAL file<a name="line.58"></a>
+<span class="sourceLineNo">059</span>     * have been deleted, or updated later in another WAL file, then we can delete the WAL file. If<a name="line.59"></a>
+<span class="sourceLineNo">060</span>     * there are old procedures in a WAL file which are never deleted or updated, then we can not<a name="line.60"></a>
+<span class="sourceLineNo">061</span>     * delete the WAL file and this will cause we hold lots of WAL file and slow down the master<a name="line.61"></a>
+<span class="sourceLineNo">062</span>     * restarts. So here we introduce this method to tell the upper layer that please update the<a name="line.62"></a>
+<span class="sourceLineNo">063</span>     * states of these procedures so that we can delete the old WAL file.<a name="line.63"></a>
+<span class="sourceLineNo">064</span>     * @param procIds the id for the procedures<a name="line.64"></a>
+<span class="sourceLineNo">065</span>     */<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    default void forceUpdate(long[] procIds) {<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><a name="line.69"></a>
+<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
+<span class="sourceLineNo">071</span>   * An Iterator over a collection of Procedure<a name="line.71"></a>
+<span class="sourceLineNo">072</span>   */<a name="line.72"></a>
+<span class="sourceLineNo">073</span>  public interface ProcedureIterator {<a name="line.73"></a>
 <span class="sourceLineNo">074</span>    /**<a name="line.74"></a>
-<span class="sourceLineNo">075</span>     * Skip the next procedure<a name="line.75"></a>
+<span class="sourceLineNo">075</span>     * Reset the Iterator by seeking to the beginning of the list.<a name="line.75"></a>
 <span class="sourceLineNo">076</span>     */<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    void skipNext();<a name="line.77"></a>
+<span class="sourceLineNo">077</span>    void reset();<a name="line.77"></a>
 <span class="sourceLineNo">078</span><a name="line.78"></a>
 <span class="sourceLineNo">079</span>    /**<a name="line.79"></a>
-<span class="sourceLineNo">080</span>     * Returns the next procedure in the iteration.<a name="line.80"></a>
-<span class="sourceLineNo">081</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.81"></a>
-<span class="sourceLineNo">082</span>     * @return the next procedure in the iteration.<a name="line.82"></a>
-<span class="sourceLineNo">083</span>     */<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    @SuppressWarnings("rawtypes")<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    Procedure next() throws IOException;<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>  /**<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public interface ProcedureLoader {<a name="line.91"></a>
+<span class="sourceLineNo">080</span>     * Returns true if the iterator has more elements.<a name="line.80"></a>
+<span class="sourceLineNo">081</span>     * (In other words, returns true if next() would return a Procedure<a name="line.81"></a>
+<span class="sourceLineNo">082</span>     * rather than throwing an exception.)<a name="line.82"></a>
+<span class="sourceLineNo">083</span>     * @return true if the iterator has more procedures<a name="line.83"></a>
+<span class="sourceLineNo">084</span>     */<a name="line.84"></a>
+<span class="sourceLineNo">085</span>    boolean hasNext();<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>     * @return true if the iterator next element is a completed procedure.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     */<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    boolean isNextFinished();<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>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.93"></a>
-<span class="sourceLineNo">094</span>     * @param maxProcId the highest proc-id in the store<a name="line.94"></a>
-<span class="sourceLineNo">095</span>     */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.100"></a>
-<span class="sourceLineNo">101</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     */<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.106"></a>
-<span class="sourceLineNo">107</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   * Add the listener to the notification list.<a name="line.114"></a>
-<span class="sourceLineNo">115</span>   * @param listener The AssignmentListener to register<a name="line.115"></a>
-<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.120"></a>
-<span class="sourceLineNo">121</span>   * @param listener The AssignmentListener to unregister<a name="line.121"></a>
-<span class="sourceLineNo">122</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.122"></a>
-<span class="sourceLineNo">123</span>   */<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  boolean unregisterListener(ProcedureStoreListener listener);<a name="line.124"></a>
-<span class="sourceLineNo">125</span><a name="line.125"></a>
-<span class="sourceLineNo">126</span>  /**<a name="line.126"></a>
-<span class="sourceLineNo">127</span>   * Start/Open the procedure store<a name="line.127"></a>
-<span class="sourceLineNo">128</span>   * @param numThreads<a name="line.128"></a>
-<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
-<span class="sourceLineNo">130</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.133"></a>
-<span class="sourceLineNo">134</span>   * @param abort true if the stop is an abort<a name="line.134"></a>
-<span class="sourceLineNo">135</span>   */<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  void stop(boolean abort);<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return true if the store is running, otherwise false.<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.144"></a>
-<span class="sourceLineNo">145</span>   */<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  int getNumThreads();<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>   * Set the number of procedure running.<a name="line.149"></a>
-<span class="sourceLineNo">150</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.150"></a>
-<span class="sourceLineNo">151</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.151"></a>
-<span class="sourceLineNo">152</span>   */<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.156"></a>
-<span class="sourceLineNo">157</span>   */<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.162"></a>
+<span class="sourceLineNo">093</span>     * Skip the next procedure<a name="line.93"></a>
+<span class="sourceLineNo">094</span>     */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    void skipNext();<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>     * Returns the next procedure in the iteration.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>     * @throws IOException if there was an error fetching/deserializing the procedure<a name="line.99"></a>
+<span class="sourceLineNo">100</span>     * @return the next procedure in the iteration.<a name="line.100"></a>
+<span class="sourceLineNo">101</span>     */<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    @SuppressWarnings("rawtypes")<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    Procedure next() throws IOException;<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>  /**<a name="line.106"></a>
+<span class="sourceLineNo">107</span>   * Interface passed to the ProcedureStore.load() method to handle the store-load events.<a name="line.107"></a>
+<span class="sourceLineNo">108</span>   */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  public interface ProcedureLoader {<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    /**<a name="line.110"></a>
+<span class="sourceLineNo">111</span>     * Called by ProcedureStore.load() to notify about the maximum proc-id in the store.<a name="line.111"></a>
+<span class="sourceLineNo">112</span>     * @param maxProcId the highest proc-id in the store<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    void setMaxProcId(long maxProcId);<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>     * Called by the ProcedureStore.load() every time a set of procedures are ready to be executed.<a name="line.117"></a>
+<span class="sourceLineNo">118</span>     * The ProcedureIterator passed to the method, has the procedure sorted in replay-order.<a name="line.118"></a>
+<span class="sourceLineNo">119</span>     * @param procIter iterator over the procedures ready to be added to the executor.<a name="line.119"></a>
+<span class="sourceLineNo">120</span>     */<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    void load(ProcedureIterator procIter) throws IOException;<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>     * Called by the ProcedureStore.load() in case we have procedures not-ready to be added to<a name="line.124"></a>
+<span class="sourceLineNo">125</span>     * the executor, which probably means they are corrupted since some information/link is missing.<a name="line.125"></a>
+<span class="sourceLineNo">126</span>     * @param procIter iterator over the procedures not ready to be added to the executor, corrupted<a name="line.126"></a>
+<span class="sourceLineNo">127</span>     */<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    void handleCorrupted(ProcedureIterator procIter) throws IOException;<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>  /**<a name="line.131"></a>
+<span class="sourceLineNo">132</span>   * Add the listener to the notification list.<a name="line.132"></a>
+<span class="sourceLineNo">133</span>   * @param listener The AssignmentListener to register<a name="line.133"></a>
+<span class="sourceLineNo">134</span>   */<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  void registerListener(ProcedureStoreListener listener);<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>   * Remove the listener from the notification list.<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param listener The AssignmentListener to unregister<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @return true if the listner was in the list and it was removed, otherwise false.<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   */<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  boolean unregisterListener(ProcedureStoreListener listener);<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>   * Start/Open the procedure store<a name="line.145"></a>
+<span class="sourceLineNo">146</span>   * @param numThreads<a name="line.146"></a>
+<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
+<span class="sourceLineNo">148</span>  void start(int numThreads) throws IOException;<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>   * Stop/Close the procedure store<a name="line.151"></a>
+<span class="sourceLineNo">152</span>   * @param abort true if the stop is an abort<a name="line.152"></a>
+<span class="sourceLineNo">153</span>   */<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  void stop(boolean abort);<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>   * @return true if the store is running, otherwise false.<a name="line.157"></a>
+<span class="sourceLineNo">158</span>   */<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  boolean isRunning();<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>   * @return the number of threads/slots passed to start()<a name="line.162"></a>
 <span class="sourceLineNo">163</span>   */<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  void load(ProcedureLoader loader) throws IOException;<a name="line.164"></a>
+<span class="sourceLineNo">164</span>  int getNumThreads();<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.168"></a>
-<span class="sourceLineNo">169</span>   *<a name="line.169"></a>
-<span class="sourceLineNo">170</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.170"></a>
-<span class="sourceLineNo">171</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.171"></a>
-<span class="sourceLineNo">172</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.172"></a>
-<span class="sourceLineNo">173</span>   *<a name="line.173"></a>
-<span class="sourceLineNo">174</span>   * @param proc the procedure to serialize and write to the store.<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * @param subprocs the newly created child of the proc.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   *<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @param procs the procedures to serialize and write to the store.<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  void insert(Procedure&lt;?&gt;[] procs);<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>   * The specified procedure was executed,<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * and the new state should be written to the store.<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * @param proc the procedure to serialize and write to the store.<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  void update(Procedure&lt;?&gt; proc);<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>   * The specified procId was removed from the executor,<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * due to completion, abort or failure.<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * The store implementor should remove all the information about the specified procId.<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * @param procId the ID of the procedure to remove.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  void delete(long procId);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  /**<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * The parent procedure completed.<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   * Update the state and mark all the child deleted.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   */<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  /**<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * The specified procIds were removed from the executor,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * due to completion, abort or failure.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @param procIds the IDs of the procedures to remove.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   * @param offset the array offset from where to start to delete<a name="line.216"></a>
-<span class="sourceLineNo">217</span>   * @param count the number of IDs to delete<a name="line.217"></a>
+<span class="sourceLineNo">167</span>   * Set the number of procedure running.<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * This can be used, for example, by the store to know how long to wait before a sync.<a name="line.168"></a>
+<span class="sourceLineNo">169</span>   * @return how many procedures are running (may not be same as &lt;code&gt;count&lt;/code&gt;).<a name="line.169"></a>
+<span class="sourceLineNo">170</span>   */<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  int setRunningProcedureCount(int count);<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>   * Acquire the lease for the procedure store.<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   */<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  void recoverLease() throws IOException;<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>   * Load the Procedures in the store.<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   * @param loader the ProcedureLoader that will handle the store-load events<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   */<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  void load(ProcedureLoader loader) throws IOException;<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>   * When a procedure is submitted to the executor insert(proc, null) will be called.<a name="line.185"></a>
+<span class="sourceLineNo">186</span>   * 'proc' has a 'RUNNABLE' state and the initial information required to start up.<a name="line.186"></a>
+<span class="sourceLineNo">187</span>   *<a name="line.187"></a>
+<span class="sourceLineNo">188</span>   * When a procedure is executed and it returns children insert(proc, subprocs) will be called.<a name="line.188"></a>
+<span class="sourceLineNo">189</span>   * 'proc' has a 'WAITING' state and an update state.<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * 'subprocs' are the children in 'RUNNABLE' state with the initial information.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   *<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * @param proc the procedure to serialize and write to the store.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param subprocs the newly created child of the proc.<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   */<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  void insert(Procedure&lt;?&gt; proc, Procedure&lt;?&gt;[] subprocs);<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>   * Serialize a set of new procedures.<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * These procedures are freshly submitted to the executor and each procedure<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * has a 'RUNNABLE' state and the initial information required to start up.<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   *<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @param procs the procedures to serialize and write to the store.<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   */<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  void insert(Procedure&lt;?&gt;[] procs);<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
+<span class="sourceLineNo">207</span>   * The specified procedure was executed,<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * and the new state should be written to the store.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * @param proc the procedure to serialize and write to the store.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  void update(Procedure&lt;?&gt; proc);<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * The specified procId was removed from the executor,<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * due to completion, abort or failure.<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * The store implementor should remove all the information about the specified procId.<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * @param procId the ID of the procedure to remove.<a name="line.217"></a>
 <span class="sourceLineNo">218</span>   */<a name="line.218"></a>
-<span class="sourceLineNo">219</span>  void delete(long[] procIds, int offset, int count);<a name="line.219"></a>
-<span class="sourceLineNo">220</span>}<a name="line.220"></a>
+<span class="sourceLineNo">219</span>  void delete(long procId);<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>   * The parent procedure completed.<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * Update the state and mark all the child deleted.<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   * @param parentProc the parent procedure to serialize and write to the store.<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * @param subProcIds the IDs of the sub-procedure to remove.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   */<a name="line.226"></a>
+<span class="sourceLineNo">227</span>  void delete(Procedure&lt;?&gt; parentProc, long[] subProcIds);<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>   * The specified procIds were removed from the executor,<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * due to completion, abort or failure.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * The store implementor should remove all the information about the specified procIds.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * @param procIds the IDs of the procedures to remove.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   * @param offset the array offset from where to start to delete<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param count the number of IDs to delete<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  void delete(long[] procIds, int offset, int count);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>}<a name="line.238"></a>
 
 
 


[16/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
index e1b183b..b456cd2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.PushType.html
@@ -53,1338 +53,1354 @@
 <span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
 <span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure;<a name="line.46"></a>
 <span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.slf4j.Logger;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.slf4j.LoggerFactory;<a name="line.57"></a>
-<span class="sourceLineNo">058</span><a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.60"></a>
-<span class="sourceLineNo">061</span><a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>/**<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * WAL implementation of the ProcedureStore.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> * &lt;p/&gt;<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * then {@link #load(ProcedureLoader)}.<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * &lt;p/&gt;<a name="line.69"></a>
-<span class="sourceLineNo">070</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * the old wal files.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * &lt;p/&gt;<a name="line.73"></a>
-<span class="sourceLineNo">074</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.74"></a>
-<span class="sourceLineNo">075</span> * the races if there are two master both wants to acquire the lease...<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * &lt;p/&gt;<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.77"></a>
-<span class="sourceLineNo">078</span> * comments of this method for more details.<a name="line.78"></a>
-<span class="sourceLineNo">079</span> * &lt;p/&gt;<a name="line.79"></a>
-<span class="sourceLineNo">080</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.80"></a>
-<span class="sourceLineNo">081</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.81"></a>
-<span class="sourceLineNo">082</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.82"></a>
-<span class="sourceLineNo">083</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.83"></a>
-<span class="sourceLineNo">084</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.84"></a>
-<span class="sourceLineNo">085</span> * &lt;p/&gt;<a name="line.85"></a>
-<span class="sourceLineNo">086</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.86"></a>
-<span class="sourceLineNo">087</span> * &lt;p/&gt;<a name="line.87"></a>
-<span class="sourceLineNo">088</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.88"></a>
-<span class="sourceLineNo">089</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.89"></a>
-<span class="sourceLineNo">090</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.90"></a>
-<span class="sourceLineNo">091</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.91"></a>
-<span class="sourceLineNo">092</span> * the modified procedures for the new wal file.<a name="line.92"></a>
-<span class="sourceLineNo">093</span> * &lt;p/&gt;<a name="line.93"></a>
-<span class="sourceLineNo">094</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.94"></a>
-<span class="sourceLineNo">095</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.95"></a>
-<span class="sourceLineNo">096</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.96"></a>
-<span class="sourceLineNo">097</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.97"></a>
-<span class="sourceLineNo">098</span> * with the tracker of every newer wal files, using the<a name="line.98"></a>
-<span class="sourceLineNo">099</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.99"></a>
-<span class="sourceLineNo">100</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.100"></a>
-<span class="sourceLineNo">101</span> * files, then we can delete it.<a name="line.101"></a>
-<span class="sourceLineNo">102</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.102"></a>
-<span class="sourceLineNo">103</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.103"></a>
-<span class="sourceLineNo">104</span> */<a name="line.104"></a>
-<span class="sourceLineNo">105</span>@InterfaceAudience.Private<a name="line.105"></a>
-<span class="sourceLineNo">106</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public interface LeaseRecovery {<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  }<a name="line.115"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreBase;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStoreTracker;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.procedure2.util.ByteSlot;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.CommonFSUtils;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.ipc.RemoteException;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.org.apache.commons.collections4.queue.CircularFifoQueue;<a name="line.61"></a>
+<span class="sourceLineNo">062</span><a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureWALHeader;<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> * WAL implementation of the ProcedureStore.<a name="line.66"></a>
+<span class="sourceLineNo">067</span> * &lt;p/&gt;<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * When starting, the upper layer will first call {@link #start(int)}, then {@link #recoverLease()},<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * then {@link #load(ProcedureLoader)}.<a name="line.69"></a>
+<span class="sourceLineNo">070</span> * &lt;p/&gt;<a name="line.70"></a>
+<span class="sourceLineNo">071</span> * In {@link #recoverLease()}, we will get the lease by closing all the existing wal files(by<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * calling recoverFileLease), and creating a new wal writer. And we will also get the list of all<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * the old wal files.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> * &lt;p/&gt;<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * FIXME: notice that the current recover lease implementation is problematic, it can not deal with<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * the races if there are two master both wants to acquire the lease...<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * &lt;p/&gt;<a name="line.77"></a>
+<span class="sourceLineNo">078</span> * In {@link #load(ProcedureLoader)} method, we will load all the active procedures. See the<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * comments of this method for more details.<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * &lt;p/&gt;<a name="line.80"></a>
+<span class="sourceLineNo">081</span> * The actual logging way is a bit like our FileSystem based WAL implementation as RS side. There is<a name="line.81"></a>
+<span class="sourceLineNo">082</span> * a {@link #slots}, which is more like the ring buffer, and in the insert, update and delete<a name="line.82"></a>
+<span class="sourceLineNo">083</span> * methods we will put thing into the {@link #slots} and wait. And there is a background sync<a name="line.83"></a>
+<span class="sourceLineNo">084</span> * thread(see the {@link #syncLoop()} method) which get data from the {@link #slots} and write them<a name="line.84"></a>
+<span class="sourceLineNo">085</span> * to the FileSystem, and notify the caller that we have finished.<a name="line.85"></a>
+<span class="sourceLineNo">086</span> * &lt;p/&gt;<a name="line.86"></a>
+<span class="sourceLineNo">087</span> * TODO: try using disruptor to increase performance and simplify the logic?<a name="line.87"></a>
+<span class="sourceLineNo">088</span> * &lt;p/&gt;<a name="line.88"></a>
+<span class="sourceLineNo">089</span> * The {@link #storeTracker} keeps track of the modified procedures in the newest wal file, which is<a name="line.89"></a>
+<span class="sourceLineNo">090</span> * also the one being written currently. And the deleted bits in it are for all the procedures, not<a name="line.90"></a>
+<span class="sourceLineNo">091</span> * only the ones in the newest wal file. And when rolling a log, we will first store it in the<a name="line.91"></a>
+<span class="sourceLineNo">092</span> * trailer of the current wal file, and then reset its modified bits, so that it can start to track<a name="line.92"></a>
+<span class="sourceLineNo">093</span> * the modified procedures for the new wal file.<a name="line.93"></a>
+<span class="sourceLineNo">094</span> * &lt;p/&gt;<a name="line.94"></a>
+<span class="sourceLineNo">095</span> * The {@link #holdingCleanupTracker} is used to test whether we are safe to delete the oldest wal<a name="line.95"></a>
+<span class="sourceLineNo">096</span> * file. When there are log rolling and there are more than 1 wal files, we will make use of it. It<a name="line.96"></a>
+<span class="sourceLineNo">097</span> * will first be initialized to the oldest file's tracker(which is stored in the trailer), using the<a name="line.97"></a>
+<span class="sourceLineNo">098</span> * method {@link ProcedureStoreTracker#resetTo(ProcedureStoreTracker, boolean)}, and then merge it<a name="line.98"></a>
+<span class="sourceLineNo">099</span> * with the tracker of every newer wal files, using the<a name="line.99"></a>
+<span class="sourceLineNo">100</span> * {@link ProcedureStoreTracker#setDeletedIfModifiedInBoth(ProcedureStoreTracker)}. If we find out<a name="line.100"></a>
+<span class="sourceLineNo">101</span> * that all the modified procedures for the oldest wal file are modified or deleted in newer wal<a name="line.101"></a>
+<span class="sourceLineNo">102</span> * files, then we can delete it. This is because that, every time we call<a name="line.102"></a>
+<span class="sourceLineNo">103</span> * {@link ProcedureStore#insert(Procedure[])} or {@link ProcedureStore#update(Procedure)}, we will<a name="line.103"></a>
+<span class="sourceLineNo">104</span> * persist the full state of a Procedure, so the earlier wal records for this procedure can all be<a name="line.104"></a>
+<span class="sourceLineNo">105</span> * deleted.<a name="line.105"></a>
+<span class="sourceLineNo">106</span> * @see ProcedureWALPrettyPrinter for printing content of a single WAL.<a name="line.106"></a>
+<span class="sourceLineNo">107</span> * @see #main(String[]) to parse a directory of MasterWALProcs.<a name="line.107"></a>
+<span class="sourceLineNo">108</span> */<a name="line.108"></a>
+<span class="sourceLineNo">109</span>@InterfaceAudience.Private<a name="line.109"></a>
+<span class="sourceLineNo">110</span>public class WALProcedureStore extends ProcedureStoreBase {<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  private static final Logger LOG = LoggerFactory.getLogger(WALProcedureStore.class);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final String LOG_PREFIX = "pv2-";<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  /** Used to construct the name of the log directory for master procedures */<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public static final String MASTER_PROCEDURE_LOGDIR = "MasterProcWALs";<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>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 64;<a name="line.119"></a>
+<span class="sourceLineNo">117</span>  public interface LeaseRecovery {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    void recoverFileLease(FileSystem fs, Path path) throws IOException;<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>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.123"></a>
+<span class="sourceLineNo">121</span>  public static final String WAL_COUNT_WARN_THRESHOLD_CONF_KEY =<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    "hbase.procedure.store.wal.warn.threshold";<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  private static final int DEFAULT_WAL_COUNT_WARN_THRESHOLD = 10;<a name="line.123"></a>
 <span class="sourceLineNo">124</span><a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.127"></a>
+<span class="sourceLineNo">125</span>  public static final String EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY =<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    "hbase.procedure.store.wal.exec.cleanup.on.load";<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  private static final boolean DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY = true;<a name="line.127"></a>
 <span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.131"></a>
+<span class="sourceLineNo">129</span>  public static final String MAX_RETRIES_BEFORE_ROLL_CONF_KEY =<a name="line.129"></a>
+<span class="sourceLineNo">130</span>    "hbase.procedure.store.wal.max.retries.before.roll";<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  private static final int DEFAULT_MAX_RETRIES_BEFORE_ROLL = 3;<a name="line.131"></a>
 <span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.135"></a>
+<span class="sourceLineNo">133</span>  public static final String WAIT_BEFORE_ROLL_CONF_KEY =<a name="line.133"></a>
+<span class="sourceLineNo">134</span>    "hbase.procedure.store.wal.wait.before.roll";<a name="line.134"></a>
+<span class="sourceLineNo">135</span>  private static final int DEFAULT_WAIT_BEFORE_ROLL = 500;<a name="line.135"></a>
 <span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.139"></a>
+<span class="sourceLineNo">137</span>  public static final String ROLL_RETRIES_CONF_KEY =<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    "hbase.procedure.store.wal.max.roll.retries";<a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private static final int DEFAULT_ROLL_RETRIES = 3;<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.143"></a>
+<span class="sourceLineNo">141</span>  public static final String MAX_SYNC_FAILURE_ROLL_CONF_KEY =<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    "hbase.procedure.store.wal.sync.failure.roll.max";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  private static final int DEFAULT_MAX_SYNC_FAILURE_ROLL = 3;<a name="line.143"></a>
 <span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.145"></a>
-<span class="sourceLineNo">146</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.149"></a>
-<span class="sourceLineNo">150</span><a name="line.150"></a>
-<span class="sourceLineNo">151</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.154"></a>
-<span class="sourceLineNo">155</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.156"></a>
+<span class="sourceLineNo">145</span>  public static final String PERIODIC_ROLL_CONF_KEY =<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    "hbase.procedure.store.wal.periodic.roll.msec";<a name="line.146"></a>
+<span class="sourceLineNo">147</span>  private static final int DEFAULT_PERIODIC_ROLL = 60 * 60 * 1000; // 1h<a name="line.147"></a>
+<span class="sourceLineNo">148</span><a name="line.148"></a>
+<span class="sourceLineNo">149</span>  public static final String SYNC_WAIT_MSEC_CONF_KEY = "hbase.procedure.store.wal.sync.wait.msec";<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  private static final int DEFAULT_SYNC_WAIT_MSEC = 100;<a name="line.150"></a>
+<span class="sourceLineNo">151</span><a name="line.151"></a>
+<span class="sourceLineNo">152</span>  public static final String USE_HSYNC_CONF_KEY = "hbase.procedure.store.wal.use.hsync";<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final boolean DEFAULT_USE_HSYNC = true;<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>  public static final String ROLL_THRESHOLD_CONF_KEY = "hbase.procedure.store.wal.roll.threshold";<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final long DEFAULT_ROLL_THRESHOLD = 32 * 1024 * 1024; // 32M<a name="line.156"></a>
 <span class="sourceLineNo">157</span><a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.158"></a>
-<span class="sourceLineNo">159</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.159"></a>
-<span class="sourceLineNo">160</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.160"></a>
-<span class="sourceLineNo">161</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  private final Condition waitCond = lock.newCondition();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>  private final Condition slotCond = lock.newCondition();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  private final Condition syncCond = lock.newCondition();<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  private final LeaseRecovery leaseRecovery;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  private final Configuration conf;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  private final FileSystem fs;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>  private final Path walDir;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  private final Path walArchiveDir;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  private final boolean enforceStreamCapability;<a name="line.171"></a>
-<span class="sourceLineNo">172</span><a name="line.172"></a>
-<span class="sourceLineNo">173</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.176"></a>
-<span class="sourceLineNo">177</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.178"></a>
-<span class="sourceLineNo">179</span><a name="line.179"></a>
-<span class="sourceLineNo">180</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  private FSDataOutputStream stream = null;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  private int runningProcCount = 1;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>  private long flushLogId = 0;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  private int syncMaxSlot = 1;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  private int slotIndex = 0;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private Thread syncThread;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>  private ByteSlot[] slots;<a name="line.188"></a>
-<span class="sourceLineNo">189</span><a name="line.189"></a>
-<span class="sourceLineNo">190</span>  private int walCountWarnThreshold;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  private int maxRetriesBeforeRoll;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  private int maxSyncFailureRoll;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  private int waitBeforeRoll;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private int rollRetries;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>  private int periodicRollMsec;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>  private long rollThreshold;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>  private boolean useHsync;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private int syncWaitMsec;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // Variables used for UI display<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>  public static class SyncMetrics {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private long timestamp;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    private long syncWaitMs;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private long totalSyncedBytes;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private int syncedEntries;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    private float syncedPerSec;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>    public long getTimestamp() {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      return timestamp;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    }<a name="line.212"></a>
+<span class="sourceLineNo">158</span>  public static final String STORE_WAL_SYNC_STATS_COUNT =<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      "hbase.procedure.store.wal.sync.stats.count";<a name="line.159"></a>
+<span class="sourceLineNo">160</span>  private static final int DEFAULT_SYNC_STATS_COUNT = 10;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>  private final LinkedList&lt;ProcedureWALFile&gt; logs = new LinkedList&lt;&gt;();<a name="line.162"></a>
+<span class="sourceLineNo">163</span>  private final ProcedureStoreTracker holdingCleanupTracker = new ProcedureStoreTracker();<a name="line.163"></a>
+<span class="sourceLineNo">164</span>  private final ProcedureStoreTracker storeTracker = new ProcedureStoreTracker();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  private final ReentrantLock lock = new ReentrantLock();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  private final Condition waitCond = lock.newCondition();<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  private final Condition slotCond = lock.newCondition();<a name="line.167"></a>
+<span class="sourceLineNo">168</span>  private final Condition syncCond = lock.newCondition();<a name="line.168"></a>
+<span class="sourceLineNo">169</span><a name="line.169"></a>
+<span class="sourceLineNo">170</span>  private final LeaseRecovery leaseRecovery;<a name="line.170"></a>
+<span class="sourceLineNo">171</span>  private final Configuration conf;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  private final FileSystem fs;<a name="line.172"></a>
+<span class="sourceLineNo">173</span>  private final Path walDir;<a name="line.173"></a>
+<span class="sourceLineNo">174</span>  private final Path walArchiveDir;<a name="line.174"></a>
+<span class="sourceLineNo">175</span>  private final boolean enforceStreamCapability;<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>  private final AtomicReference&lt;Throwable&gt; syncException = new AtomicReference&lt;&gt;();<a name="line.177"></a>
+<span class="sourceLineNo">178</span>  private final AtomicBoolean loading = new AtomicBoolean(true);<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  private final AtomicBoolean inSync = new AtomicBoolean(false);<a name="line.179"></a>
+<span class="sourceLineNo">180</span>  private final AtomicLong totalSynced = new AtomicLong(0);<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  private final AtomicLong lastRollTs = new AtomicLong(0);<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  private final AtomicLong syncId = new AtomicLong(0);<a name="line.182"></a>
+<span class="sourceLineNo">183</span><a name="line.183"></a>
+<span class="sourceLineNo">184</span>  private LinkedTransferQueue&lt;ByteSlot&gt; slotsCache = null;<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  private Set&lt;ProcedureWALFile&gt; corruptedLogs = null;<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private FSDataOutputStream stream = null;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  private int runningProcCount = 1;<a name="line.187"></a>
+<span class="sourceLineNo">188</span>  private long flushLogId = 0;<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  private int syncMaxSlot = 1;<a name="line.189"></a>
+<span class="sourceLineNo">190</span>  private int slotIndex = 0;<a name="line.190"></a>
+<span class="sourceLineNo">191</span>  private Thread syncThread;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  private ByteSlot[] slots;<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  private int walCountWarnThreshold;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>  private int maxRetriesBeforeRoll;<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  private int maxSyncFailureRoll;<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  private int waitBeforeRoll;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>  private int rollRetries;<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private int periodicRollMsec;<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private long rollThreshold;<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private boolean useHsync;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private int syncWaitMsec;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  // Variables used for UI display<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private CircularFifoQueue&lt;SyncMetrics&gt; syncMetricsQueue;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  public static class SyncMetrics {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private long timestamp;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    private long syncWaitMs;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private long totalSyncedBytes;<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private int syncedEntries;<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    private float syncedPerSec;<a name="line.212"></a>
 <span class="sourceLineNo">213</span><a name="line.213"></a>
-<span class="sourceLineNo">214</span>    public long getSyncWaitMs() {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      return syncWaitMs;<a name="line.215"></a>
+<span class="sourceLineNo">214</span>    public long getTimestamp() {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      return timestamp;<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>    public long getTotalSyncedBytes() {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      return totalSyncedBytes;<a name="line.219"></a>
+<span class="sourceLineNo">218</span>    public long getSyncWaitMs() {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      return syncWaitMs;<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>    public long getSyncedEntries() {<a name="line.222"></a>
-<span class="sourceLineNo">223</span>      return syncedEntries;<a name="line.223"></a>
+<span class="sourceLineNo">222</span>    public long getTotalSyncedBytes() {<a name="line.222"></a>
+<span class="sourceLineNo">223</span>      return totalSyncedBytes;<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>    public float getSyncedPerSec() {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      return syncedPerSec;<a name="line.227"></a>
+<span class="sourceLineNo">226</span>    public long getSyncedEntries() {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>      return syncedEntries;<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><a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      throws IOException {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    this(conf,<a name="line.233"></a>
-<span class="sourceLineNo">234</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.234"></a>
-<span class="sourceLineNo">235</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.235"></a>
-<span class="sourceLineNo">236</span>        leaseRecovery);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
-<span class="sourceLineNo">238</span><a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @VisibleForTesting<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    this.conf = conf;<a name="line.242"></a>
-<span class="sourceLineNo">243</span>    this.leaseRecovery = leaseRecovery;<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    this.walDir = walDir;<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    this.walArchiveDir = walArchiveDir;<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    this.fs = walDir.getFileSystem(conf);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.247"></a>
-<span class="sourceLineNo">248</span><a name="line.248"></a>
-<span class="sourceLineNo">249</span>    // Create the log directory for the procedure store<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    if (!fs.exists(walDir)) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      if (!fs.mkdirs(walDir)) {<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        throw new IOException("Unable to mkdir " + walDir);<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      }<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    }<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    // Now that it exists, set the log policy<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    String storagePolicy =<a name="line.256"></a>
-<span class="sourceLineNo">257</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.258"></a>
-<span class="sourceLineNo">259</span><a name="line.259"></a>
-<span class="sourceLineNo">260</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.262"></a>
-<span class="sourceLineNo">263</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.263"></a>
-<span class="sourceLineNo">264</span>      } else {<a name="line.264"></a>
-<span class="sourceLineNo">265</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>
-<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>  @Override<a name="line.270"></a>
-<span class="sourceLineNo">271</span>  public void start(int numSlots) throws IOException {<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    if (!setRunning(true)) {<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      return;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    }<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    // Init buffer slots<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    loading.set(true);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    runningProcCount = numSlots;<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    syncMaxSlot = numSlots;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    slots = new ByteSlot[numSlots];<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      slotsCache.offer(new ByteSlot());<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>    // Tunings<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    walCountWarnThreshold =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    maxRetriesBeforeRoll =<a name="line.289"></a>
-<span class="sourceLineNo">290</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>    // WebUI<a name="line.299"></a>
-<span class="sourceLineNo">300</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.300"></a>
-<span class="sourceLineNo">301</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.301"></a>
+<span class="sourceLineNo">229</span><a name="line.229"></a>
+<span class="sourceLineNo">230</span>    public float getSyncedPerSec() {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      return syncedPerSec;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
+<span class="sourceLineNo">233</span>  }<a name="line.233"></a>
+<span class="sourceLineNo">234</span><a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public WALProcedureStore(final Configuration conf, final LeaseRecovery leaseRecovery)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    this(conf,<a name="line.237"></a>
+<span class="sourceLineNo">238</span>        new Path(CommonFSUtils.getWALRootDir(conf), MASTER_PROCEDURE_LOGDIR),<a name="line.238"></a>
+<span class="sourceLineNo">239</span>        new Path(CommonFSUtils.getWALRootDir(conf), HConstants.HREGION_OLDLOGDIR_NAME),<a name="line.239"></a>
+<span class="sourceLineNo">240</span>        leaseRecovery);<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>  @VisibleForTesting<a name="line.243"></a>
+<span class="sourceLineNo">244</span>  public WALProcedureStore(final Configuration conf, final Path walDir, final Path walArchiveDir,<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      final LeaseRecovery leaseRecovery) throws IOException {<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    this.conf = conf;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    this.leaseRecovery = leaseRecovery;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    this.walDir = walDir;<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    this.walArchiveDir = walArchiveDir;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    this.fs = walDir.getFileSystem(conf);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    this.enforceStreamCapability = conf.getBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, true);<a name="line.251"></a>
+<span class="sourceLineNo">252</span><a name="line.252"></a>
+<span class="sourceLineNo">253</span>    // Create the log directory for the procedure store<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    if (!fs.exists(walDir)) {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      if (!fs.mkdirs(walDir)) {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        throw new IOException("Unable to mkdir " + walDir);<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>    // Now that it exists, set the log policy<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    String storagePolicy =<a name="line.260"></a>
+<span class="sourceLineNo">261</span>        conf.get(HConstants.WAL_STORAGE_POLICY, HConstants.DEFAULT_WAL_STORAGE_POLICY);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    CommonFSUtils.setStoragePolicy(fs, walDir, storagePolicy);<a name="line.262"></a>
+<span class="sourceLineNo">263</span><a name="line.263"></a>
+<span class="sourceLineNo">264</span>    // Create archive dir up front. Rename won't work w/o it up on HDFS.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    if (this.walArchiveDir != null &amp;&amp; !this.fs.exists(this.walArchiveDir)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      if (this.fs.mkdirs(this.walArchiveDir)) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        LOG.debug("Created Procedure Store WAL archive dir {}", this.walArchiveDir);<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      } else {<a name="line.268"></a>
+<span class="sourceLineNo">269</span>        LOG.warn("Failed create of {}", this.walArchiveDir);<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>  }<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>  @Override<a name="line.274"></a>
+<span class="sourceLineNo">275</span>  public void start(int numSlots) throws IOException {<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    if (!setRunning(true)) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>      return;<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    }<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>    // Init buffer slots<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    loading.set(true);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    runningProcCount = numSlots;<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    syncMaxSlot = numSlots;<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    slots = new ByteSlot[numSlots];<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    slotsCache = new LinkedTransferQueue&lt;&gt;();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    while (slotsCache.size() &lt; numSlots) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      slotsCache.offer(new ByteSlot());<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
+<span class="sourceLineNo">289</span><a name="line.289"></a>
+<span class="sourceLineNo">290</span>    // Tunings<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    walCountWarnThreshold =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      conf.getInt(WAL_COUNT_WARN_THRESHOLD_CONF_KEY, DEFAULT_WAL_COUNT_WARN_THRESHOLD);<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    maxRetriesBeforeRoll =<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      conf.getInt(MAX_RETRIES_BEFORE_ROLL_CONF_KEY, DEFAULT_MAX_RETRIES_BEFORE_ROLL);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    maxSyncFailureRoll = conf.getInt(MAX_SYNC_FAILURE_ROLL_CONF_KEY, DEFAULT_MAX_SYNC_FAILURE_ROLL);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    waitBeforeRoll = conf.getInt(WAIT_BEFORE_ROLL_CONF_KEY, DEFAULT_WAIT_BEFORE_ROLL);<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    rollRetries = conf.getInt(ROLL_RETRIES_CONF_KEY, DEFAULT_ROLL_RETRIES);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    rollThreshold = conf.getLong(ROLL_THRESHOLD_CONF_KEY, DEFAULT_ROLL_THRESHOLD);<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    periodicRollMsec = conf.getInt(PERIODIC_ROLL_CONF_KEY, DEFAULT_PERIODIC_ROLL);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    syncWaitMsec = conf.getInt(SYNC_WAIT_MSEC_CONF_KEY, DEFAULT_SYNC_WAIT_MSEC);<a name="line.300"></a>
+<span class="sourceLineNo">301</span>    useHsync = conf.getBoolean(USE_HSYNC_CONF_KEY, DEFAULT_USE_HSYNC);<a name="line.301"></a>
 <span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>    // Init sync thread<a name="line.303"></a>
-<span class="sourceLineNo">304</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>      @Override<a name="line.305"></a>
-<span class="sourceLineNo">306</span>      public void run() {<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        try {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>          syncLoop();<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        } catch (Throwable e) {<a name="line.309"></a>
-<span class="sourceLineNo">310</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>          if (!isSyncAborted()) {<a name="line.311"></a>
-<span class="sourceLineNo">312</span>            sendAbortProcessSignal();<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>    };<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    syncThread.start();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>  @Override<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  public void stop(final boolean abort) {<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (!setRunning(false)) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      return;<a name="line.323"></a>
-<span class="sourceLineNo">324</span>    }<a name="line.324"></a>
-<span class="sourceLineNo">325</span><a name="line.325"></a>
-<span class="sourceLineNo">326</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    sendStopSignal();<a name="line.328"></a>
-<span class="sourceLineNo">329</span>    if (!isSyncAborted()) {<a name="line.329"></a>
-<span class="sourceLineNo">330</span>      try {<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        while (syncThread.isAlive()) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>          sendStopSignal();<a name="line.332"></a>
-<span class="sourceLineNo">333</span>          syncThread.join(250);<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        }<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      } catch (InterruptedException e) {<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        LOG.warn("join interrupted", e);<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        Thread.currentThread().interrupt();<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      }<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    }<a name="line.339"></a>
-<span class="sourceLineNo">340</span><a name="line.340"></a>
-<span class="sourceLineNo">341</span>    // Close the writer<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    closeCurrentLogStream();<a name="line.342"></a>
-<span class="sourceLineNo">343</span><a name="line.343"></a>
-<span class="sourceLineNo">344</span>    // Close the old logs<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    // they should be already closed, this is just in case the load fails<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // and we call start() and then stop()<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    for (ProcedureWALFile log: logs) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      log.close();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    }<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    logs.clear();<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    loading.set(true);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  }<a name="line.352"></a>
-<span class="sourceLineNo">353</span><a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private void sendStopSignal() {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    if (lock.tryLock()) {<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      try {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        waitCond.signalAll();<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        syncCond.signalAll();<a name="line.358"></a>
-<span class="sourceLineNo">359</span>      } finally {<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        lock.unlock();<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>  }<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>  public int getNumThreads() {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    return slots == null ? 0 : slots.length;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  @Override<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  public int setRunningProcedureCount(final int count) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return this.runningProcCount;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    return storeTracker;<a name="line.377"></a>
+<span class="sourceLineNo">303</span>    // WebUI<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    syncMetricsQueue = new CircularFifoQueue&lt;&gt;(<a name="line.304"></a>
+<span class="sourceLineNo">305</span>      conf.getInt(STORE_WAL_SYNC_STATS_COUNT, DEFAULT_SYNC_STATS_COUNT));<a name="line.305"></a>
+<span class="sourceLineNo">306</span><a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // Init sync thread<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    syncThread = new Thread("WALProcedureStoreSyncThread") {<a name="line.308"></a>
+<span class="sourceLineNo">309</span>      @Override<a name="line.309"></a>
+<span class="sourceLineNo">310</span>      public void run() {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        try {<a name="line.311"></a>
+<span class="sourceLineNo">312</span>          syncLoop();<a name="line.312"></a>
+<span class="sourceLineNo">313</span>        } catch (Throwable e) {<a name="line.313"></a>
+<span class="sourceLineNo">314</span>          LOG.error("Got an exception from the sync-loop", e);<a name="line.314"></a>
+<span class="sourceLineNo">315</span>          if (!isSyncAborted()) {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>            sendAbortProcessSignal();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>          }<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        }<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    };<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    syncThread.start();<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>  @Override<a name="line.324"></a>
+<span class="sourceLineNo">325</span>  public void stop(final boolean abort) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    if (!setRunning(false)) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      return;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
+<span class="sourceLineNo">329</span><a name="line.329"></a>
+<span class="sourceLineNo">330</span>    LOG.info("Stopping the WAL Procedure Store, isAbort=" + abort +<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      (isSyncAborted() ? " (self aborting)" : ""));<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    sendStopSignal();<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    if (!isSyncAborted()) {<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      try {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        while (syncThread.isAlive()) {<a name="line.335"></a>
+<span class="sourceLineNo">336</span>          sendStopSignal();<a name="line.336"></a>
+<span class="sourceLineNo">337</span>          syncThread.join(250);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        }<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      } catch (InterruptedException e) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>        LOG.warn("join interrupted", e);<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        Thread.currentThread().interrupt();<a name="line.341"></a>
+<span class="sourceLineNo">342</span>      }<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    }<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Close the writer<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    closeCurrentLogStream();<a name="line.346"></a>
+<span class="sourceLineNo">347</span><a name="line.347"></a>
+<span class="sourceLineNo">348</span>    // Close the old logs<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    // they should be already closed, this is just in case the load fails<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // and we call start() and then stop()<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    for (ProcedureWALFile log: logs) {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      log.close();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    logs.clear();<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    loading.set(true);<a name="line.355"></a>
+<span class="sourceLineNo">356</span>  }<a name="line.356"></a>
+<span class="sourceLineNo">357</span><a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private void sendStopSignal() {<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    if (lock.tryLock()) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      try {<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        waitCond.signalAll();<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        syncCond.signalAll();<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      } finally {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        lock.unlock();<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      }<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @Override<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  public int getNumThreads() {<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return slots == null ? 0 : slots.length;<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  }<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  @Override<a name="line.374"></a>
+<span class="sourceLineNo">375</span>  public int setRunningProcedureCount(final int count) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this.runningProcCount = count &gt; 0 ? Math.min(count, slots.length) : slots.length;<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    return this.runningProcCount;<a name="line.377"></a>
 <span class="sourceLineNo">378</span>  }<a name="line.378"></a>
 <span class="sourceLineNo">379</span><a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    lock.lock();<a name="line.381"></a>
-<span class="sourceLineNo">382</span>    try {<a name="line.382"></a>
-<span class="sourceLineNo">383</span>      return new ArrayList&lt;&gt;(logs);<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    } finally {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      lock.unlock();<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    }<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  }<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    return corruptedLogs;<a name="line.390"></a>
+<span class="sourceLineNo">380</span>  public ProcedureStoreTracker getStoreTracker() {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    return storeTracker;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>  }<a name="line.382"></a>
+<span class="sourceLineNo">383</span><a name="line.383"></a>
+<span class="sourceLineNo">384</span>  public ArrayList&lt;ProcedureWALFile&gt; getActiveLogs() {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    lock.lock();<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    try {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      return new ArrayList&lt;&gt;(logs);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    } finally {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      lock.unlock();<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
 <span class="sourceLineNo">391</span>  }<a name="line.391"></a>
 <span class="sourceLineNo">392</span><a name="line.392"></a>
-<span class="sourceLineNo">393</span>  @Override<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  public void recoverLease() throws IOException {<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    lock.lock();<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    try {<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      boolean afterFirstAttempt = false;<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      while (isRunning()) {<a name="line.399"></a>
-<span class="sourceLineNo">400</span>        // Don't sleep before first attempt<a name="line.400"></a>
-<span class="sourceLineNo">401</span>        if (afterFirstAttempt) {<a name="line.401"></a>
-<span class="sourceLineNo">402</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.402"></a>
-<span class="sourceLineNo">403</span>              waitBeforeRoll);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>        } else {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          afterFirstAttempt = true;<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        // Get Log-MaxID and recover lease on old logs<a name="line.409"></a>
-<span class="sourceLineNo">410</span>        try {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>          flushLogId = initOldLogs(oldLogs);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>        } catch (FileNotFoundException e) {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>          continue;<a name="line.414"></a>
-<span class="sourceLineNo">415</span>        }<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>        // Create new state-log<a name="line.417"></a>
-<span class="sourceLineNo">418</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>          // someone else has already created this log<a name="line.419"></a>
-<span class="sourceLineNo">420</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.420"></a>
-<span class="sourceLineNo">421</span>          continue;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>        }<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>        // We have the lease on the log<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        oldLogs = getLogFiles();<a name="line.425"></a>
-<span class="sourceLineNo">426</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        break;<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      }<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    } finally {<a name="line.435"></a>
-<span class="sourceLineNo">436</span>      lock.unlock();<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    }<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  @Override<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    lock.lock();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    try {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      if (logs.isEmpty()) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        throw new RuntimeException("recoverLease() must be called before loading data");<a name="line.445"></a>
-<span class="sourceLineNo">446</span>      }<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>      // Nothing to do, If we have only the current log.<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      if (logs.size() == 1) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        LOG.trace("No state logs to replay.");<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        loader.setMaxProcId(0);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        return;<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>      // Load the old logs<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      it.next(); // Skip the current log<a name="line.457"></a>
+<span class="sourceLineNo">393</span>  public Set&lt;ProcedureWALFile&gt; getCorruptedLogs() {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>    return corruptedLogs;<a name="line.394"></a>
+<span class="sourceLineNo">395</span>  }<a name="line.395"></a>
+<span class="sourceLineNo">396</span><a name="line.396"></a>
+<span class="sourceLineNo">397</span>  @Override<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  public void recoverLease() throws IOException {<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    lock.lock();<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    try {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>      LOG.trace("Starting WAL Procedure Store lease recovery");<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      boolean afterFirstAttempt = false;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      while (isRunning()) {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>        // Don't sleep before first attempt<a name="line.404"></a>
+<span class="sourceLineNo">405</span>        if (afterFirstAttempt) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>          LOG.trace("Sleep {} ms after first lease recovery attempt.",<a name="line.406"></a>
+<span class="sourceLineNo">407</span>              waitBeforeRoll);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>          Threads.sleepWithoutInterrupt(waitBeforeRoll);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        } else {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>          afterFirstAttempt = true;<a name="line.410"></a>
+<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
+<span class="sourceLineNo">412</span>        FileStatus[] oldLogs = getLogFiles();<a name="line.412"></a>
+<span class="sourceLineNo">413</span>        // Get Log-MaxID and recover lease on old logs<a name="line.413"></a>
+<span class="sourceLineNo">414</span>        try {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          flushLogId = initOldLogs(oldLogs);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        } catch (FileNotFoundException e) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>          LOG.warn("Someone else is active and deleted logs. retrying.", e);<a name="line.417"></a>
+<span class="sourceLineNo">418</span>          continue;<a name="line.418"></a>
+<span class="sourceLineNo">419</span>        }<a name="line.419"></a>
+<span class="sourceLineNo">420</span><a name="line.420"></a>
+<span class="sourceLineNo">421</span>        // Create new state-log<a name="line.421"></a>
+<span class="sourceLineNo">422</span>        if (!rollWriter(flushLogId + 1)) {<a name="line.422"></a>
+<span class="sourceLineNo">423</span>          // someone else has already created this log<a name="line.423"></a>
+<span class="sourceLineNo">424</span>          LOG.debug("Someone else has already created log {}. Retrying.", flushLogId);<a name="line.424"></a>
+<span class="sourceLineNo">425</span>          continue;<a name="line.425"></a>
+<span class="sourceLineNo">426</span>        }<a name="line.426"></a>
+<span class="sourceLineNo">427</span><a name="line.427"></a>
+<span class="sourceLineNo">428</span>        // We have the lease on the log<a name="line.428"></a>
+<span class="sourceLineNo">429</span>        oldLogs = getLogFiles();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        if (getMaxLogId(oldLogs) &gt; flushLogId) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>          LOG.debug("Someone else created new logs. Expected maxLogId &lt; {}", flushLogId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>          logs.getLast().removeFile(this.walArchiveDir);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>          continue;<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>        LOG.trace("Lease acquired for flushLogId={}", flushLogId);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>        break;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      }<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    } finally {<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      lock.unlock();<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    }<a name="line.441"></a>
+<span class="sourceLineNo">442</span>  }<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>  @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public void load(ProcedureLoader loader) throws IOException {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    lock.lock();<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    try {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      if (logs.isEmpty()) {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>        throw new RuntimeException("recoverLease() must be called before loading data");<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>      // Nothing to do, If we have only the current log.<a name="line.452"></a>
+<span class="sourceLineNo">453</span>      if (logs.size() == 1) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        LOG.trace("No state logs to replay.");<a name="line.454"></a>
+<span class="sourceLineNo">455</span>        loader.setMaxProcId(0);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>        return;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      }<a name="line.457"></a>
 <span class="sourceLineNo">458</span><a name="line.458"></a>
-<span class="sourceLineNo">459</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>        @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        public void setMaxProcId(long maxProcId) {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>          loader.load(procIter);<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>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          loader.handleCorrupted(procIter);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span><a name="line.475"></a>
-<span class="sourceLineNo">476</span>        @Override<a name="line.476"></a>
-<span class="sourceLineNo">477</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          if (corruptedLogs == null) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.479"></a>
-<span class="sourceLineNo">480</span>          }<a name="line.480"></a>
-<span class="sourceLineNo">481</span>          corruptedLogs.add(log);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>          // TODO: sideline corrupted log<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        }<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      });<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    } finally {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      try {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        // try to cleanup inactive wals and complete the operation<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        buildHoldingCleanupTracker();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>        tryCleanupLogsOnLoad();<a name="line.489"></a>
-<span class="sourceLineNo">490</span>        loading.set(false);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>      } finally {<a name="line.491"></a>
-<span class="sourceLineNo">492</span>        lock.unlock();<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>  }<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>  private void tryCleanupLogsOnLoad() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    // nothing to cleanup.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    if (logs.size() &lt;= 1) return;<a name="line.499"></a>
+<span class="sourceLineNo">459</span>      // Load the old logs<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      Iterator&lt;ProcedureWALFile&gt; it = logs.descendingIterator();<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      it.next(); // Skip the current log<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>      ProcedureWALFormat.load(it, storeTracker, new ProcedureWALFormat.Loader() {<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>        @Override<a name="line.465"></a>
+<span class="sourceLineNo">466</span>        public void setMaxProcId(long maxProcId) {<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          loader.setMaxProcId(maxProcId);<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>        @Override<a name="line.470"></a>
+<span class="sourceLineNo">471</span>        public void load(ProcedureIterator procIter) throws IOException {<a name="line.471"></a>
+<span class="sourceLineNo">472</span>          loader.load(procIter);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>        }<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>        @Override<a name="line.475"></a>
+<span class="sourceLineNo">476</span>        public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>          loader.handleCorrupted(procIter);<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        }<a name="line.478"></a>
+<span class="sourceLineNo">479</span><a name="line.479"></a>
+<span class="sourceLineNo">480</span>        @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>        public void markCorruptedWAL(ProcedureWALFile log, IOException e) {<a name="line.481"></a>
+<span class="sourceLineNo">482</span>          if (corruptedLogs == null) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>            corruptedLogs = new HashSet&lt;&gt;();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>          }<a name="line.484"></a>
+<span class="sourceLineNo">485</span>          corruptedLogs.add(log);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>          // TODO: sideline corrupted log<a name="line.486"></a>
+<span class="sourceLineNo">487</span>        }<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      });<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    } finally {<a name="line.489"></a>
+<span class="sourceLineNo">490</span>      try {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        // try to cleanup inactive wals and complete the operation<a name="line.491"></a>
+<span class="sourceLineNo">492</span>        buildHoldingCleanupTracker();<a name="line.492"></a>
+<span class="sourceLineNo">493</span>        tryCleanupLogsOnLoad();<a name="line.493"></a>
+<span class="sourceLineNo">494</span>        loading.set(false);<a name="line.494"></a>
+<span class="sourceLineNo">495</span>      } finally {<a name="line.495"></a>
+<span class="sourceLineNo">496</span>        lock.unlock();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      }<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    }<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
 <span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    // the config says to not cleanup wals on load.<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    if (!conf.getBoolean(EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY,<a name="line.502"></a>
-<span class="sourceLineNo">503</span>      DEFAULT_EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY)) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.debug("WALs cleanup on load is not enabled: " + getActiveLogs());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>      return;<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>    try {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      periodicRoll();<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    } catch (IOException e) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>      LOG.warn("Unable to cleanup logs on load: " + e.getMessage(), e);<a name="line.511"></a>
+<span class="sourceLineNo">501</span>  private void tryCleanupLogsOnLoad() {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    // nothing to cleanup.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    if (logs.size() &lt;= 1) {<a name="line.503"></a>
+<span class="sourceLineNo">504</span>      return;<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>    // the config says to not cleanup wals on load.<a name="lin

<TRUNCATED>

[25/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
index 061ce80..bdfc3f8 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html
@@ -39,2126 +39,2163 @@
 <span class="sourceLineNo">031</span>import java.util.Set;<a name="line.31"></a>
 <span class="sourceLineNo">032</span>import java.util.concurrent.ConcurrentHashMap;<a name="line.32"></a>
 <span class="sourceLineNo">033</span>import java.util.concurrent.CopyOnWriteArrayList;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import java.util.concurrent.TimeUnit;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import java.util.stream.Collectors;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import java.util.stream.Stream;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.conf.Configuration;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.HConstants;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.security.User;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.slf4j.Logger;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.slf4j.LoggerFactory;<a name="line.55"></a>
-<span class="sourceLineNo">056</span><a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.58"></a>
+<span class="sourceLineNo">034</span>import java.util.concurrent.Executor;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import java.util.concurrent.Executors;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import java.util.concurrent.TimeUnit;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import java.util.concurrent.atomic.AtomicLong;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import java.util.stream.Collectors;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import java.util.stream.Stream;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.conf.Configuration;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.HConstants;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.exceptions.IllegalArgumentIOException;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.log.HBaseMarkers;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.procedure2.Procedure.LockState;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureIterator;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.procedure2.store.ProcedureStore.ProcedureStoreListener;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.procedure2.util.StringUtils;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.security.User;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.util.NonceKey;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.slf4j.Logger;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.slf4j.LoggerFactory;<a name="line.58"></a>
 <span class="sourceLineNo">059</span><a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.63"></a>
-<span class="sourceLineNo">064</span> * The executor has a ProcedureStore associated.<a name="line.64"></a>
-<span class="sourceLineNo">065</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.65"></a>
-<span class="sourceLineNo">066</span> *<a name="line.66"></a>
-<span class="sourceLineNo">067</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.67"></a>
-<span class="sourceLineNo">068</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.68"></a>
-<span class="sourceLineNo">069</span> * procedures are resumed and the once failed will be rolledback.<a name="line.69"></a>
+<span class="sourceLineNo">060</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hbase.thirdparty.com.google.common.base.Preconditions;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos.ProcedureState;<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> * Thread Pool that executes the submitted procedures.<a name="line.67"></a>
+<span class="sourceLineNo">068</span> * The executor has a ProcedureStore associated.<a name="line.68"></a>
+<span class="sourceLineNo">069</span> * Each operation is logged and on restart the pending procedures are resumed.<a name="line.69"></a>
 <span class="sourceLineNo">070</span> *<a name="line.70"></a>
-<span class="sourceLineNo">071</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * check for the finished state via isFinished(procId)<a name="line.72"></a>
-<span class="sourceLineNo">073</span> * and get the result via getResult(procId)<a name="line.73"></a>
-<span class="sourceLineNo">074</span> */<a name="line.74"></a>
-<span class="sourceLineNo">075</span>@InterfaceAudience.Private<a name="line.75"></a>
-<span class="sourceLineNo">076</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.82"></a>
-<span class="sourceLineNo">083</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.84"></a>
+<span class="sourceLineNo">071</span> * Unless the Procedure code throws an error (e.g. invalid user input)<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * the procedure will complete (at some point in time), On restart the pending<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * procedures are resumed and the once failed will be rolledback.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> *<a name="line.74"></a>
+<span class="sourceLineNo">075</span> * The user can add procedures to the executor via submitProcedure(proc)<a name="line.75"></a>
+<span class="sourceLineNo">076</span> * check for the finished state via isFinished(procId)<a name="line.76"></a>
+<span class="sourceLineNo">077</span> * and get the result via getResult(procId)<a name="line.77"></a>
+<span class="sourceLineNo">078</span> */<a name="line.78"></a>
+<span class="sourceLineNo">079</span>@InterfaceAudience.Private<a name="line.79"></a>
+<span class="sourceLineNo">080</span>public class ProcedureExecutor&lt;TEnvironment&gt; {<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  private static final Logger LOG = LoggerFactory.getLogger(ProcedureExecutor.class);<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  public static final String CHECK_OWNER_SET_CONF_KEY = "hbase.procedure.check.owner.set";<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private static final boolean DEFAULT_CHECK_OWNER_SET = false;<a name="line.84"></a>
 <span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  /**<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.87"></a>
-<span class="sourceLineNo">088</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.88"></a>
-<span class="sourceLineNo">089</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.89"></a>
-<span class="sourceLineNo">090</span>   */<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   */<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static class Testing {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    protected boolean killIfHasParent = true;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.101"></a>
-<span class="sourceLineNo">102</span>     * persisting all the state it needs to recover after a crash.<a name="line.102"></a>
-<span class="sourceLineNo">103</span>     */<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.108"></a>
-<span class="sourceLineNo">109</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.109"></a>
-<span class="sourceLineNo">110</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.110"></a>
-<span class="sourceLineNo">111</span>     */<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    protected boolean killAfterStoreUpdate = false;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>        this.killBeforeStoreUpdate = !kill;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>      }<a name="line.120"></a>
-<span class="sourceLineNo">121</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<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>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        return false;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      }<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>        this.killAfterStoreUpdate = !kill;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>      }<a name="line.139"></a>
-<span class="sourceLineNo">140</span>      return kill;<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>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<a name="line.144"></a>
+<span class="sourceLineNo">086</span>  public static final String WORKER_KEEP_ALIVE_TIME_CONF_KEY =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      "hbase.procedure.worker.keep.alive.time.msec";<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  private static final long DEFAULT_WORKER_KEEP_ALIVE_TIME = TimeUnit.MINUTES.toMillis(1);<a name="line.88"></a>
+<span class="sourceLineNo">089</span><a name="line.89"></a>
+<span class="sourceLineNo">090</span>  /**<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * {@link #testing} is non-null when ProcedureExecutor is being tested. Tests will try to<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   * break PE having it fail at various junctures. When non-null, testing is set to an instance of<a name="line.92"></a>
+<span class="sourceLineNo">093</span>   * the below internal {@link Testing} class with flags set for the particular test.<a name="line.93"></a>
+<span class="sourceLineNo">094</span>   */<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  Testing testing = null;<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>   * Class with parameters describing how to fail/die when in testing-context.<a name="line.98"></a>
+<span class="sourceLineNo">099</span>   */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  public static class Testing {<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    protected boolean killIfHasParent = true;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    protected boolean killIfSuspended = false;<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>     * Kill the PE BEFORE we store state to the WAL. Good for figuring out if a Procedure is<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     * persisting all the state it needs to recover after a crash.<a name="line.106"></a>
+<span class="sourceLineNo">107</span>     */<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    protected boolean killBeforeStoreUpdate = false;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    protected boolean toggleKillBeforeStoreUpdate = false;<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>     * Set when we want to fail AFTER state has been stored into the WAL. Rarely used. HBASE-20978<a name="line.112"></a>
+<span class="sourceLineNo">113</span>     * is about a case where memory-state was being set after store to WAL where a crash could<a name="line.113"></a>
+<span class="sourceLineNo">114</span>     * cause us to get stuck. This flag allows killing at what was a vulnerable time.<a name="line.114"></a>
+<span class="sourceLineNo">115</span>     */<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    protected boolean killAfterStoreUpdate = false;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    protected boolean toggleKillAfterStoreUpdate = false;<a name="line.117"></a>
+<span class="sourceLineNo">118</span><a name="line.118"></a>
+<span class="sourceLineNo">119</span>    protected boolean shouldKillBeforeStoreUpdate() {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      final boolean kill = this.killBeforeStoreUpdate;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>      if (this.toggleKillBeforeStoreUpdate) {<a name="line.121"></a>
+<span class="sourceLineNo">122</span>        this.killBeforeStoreUpdate = !kill;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        LOG.warn("Toggle KILL before store update to: " + this.killBeforeStoreUpdate);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      }<a name="line.124"></a>
+<span class="sourceLineNo">125</span>      return kill;<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>    protected boolean shouldKillBeforeStoreUpdate(boolean isSuspended, boolean hasParent) {<a name="line.128"></a>
+<span class="sourceLineNo">129</span>      if (isSuspended &amp;&amp; !killIfSuspended) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>        return false;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>      }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>      if (hasParent &amp;&amp; !killIfHasParent) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        return false;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>      return shouldKillBeforeStoreUpdate();<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>    protected boolean shouldKillAfterStoreUpdate() {<a name="line.138"></a>
+<span class="sourceLineNo">139</span>      final boolean kill = this.killAfterStoreUpdate;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>      if (this.toggleKillAfterStoreUpdate) {<a name="line.140"></a>
+<span class="sourceLineNo">141</span>        this.killAfterStoreUpdate = !kill;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>        LOG.warn("Toggle KILL after store update to: " + this.killAfterStoreUpdate);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>      }<a name="line.143"></a>
+<span class="sourceLineNo">144</span>      return kill;<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>  public interface ProcedureExecutorListener {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    void procedureLoaded(long procId);<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    void procedureAdded(long procId);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    void procedureFinished(long procId);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  }<a name="line.152"></a>
-<span class="sourceLineNo">153</span><a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    private long clientAckTime;<a name="line.156"></a>
+<span class="sourceLineNo">146</span><a name="line.146"></a>
+<span class="sourceLineNo">147</span>    protected boolean shouldKillAfterStoreUpdate(final boolean isSuspended) {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      return (isSuspended &amp;&amp; !killIfSuspended) ? false : shouldKillAfterStoreUpdate();<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>  public interface ProcedureExecutorListener {<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    void procedureLoaded(long procId);<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    void procedureAdded(long procId);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>    void procedureFinished(long procId);<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>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.158"></a>
-<span class="sourceLineNo">159</span>      this.procedure = procedure;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      clientAckTime = -1;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
-<span class="sourceLineNo">162</span><a name="line.162"></a>
-<span class="sourceLineNo">163</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      return procedure;<a name="line.164"></a>
+<span class="sourceLineNo">158</span>  private static final class CompletedProcedureRetainer&lt;TEnvironment&gt; {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    private final Procedure&lt;TEnvironment&gt; procedure;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>    private long clientAckTime;<a name="line.160"></a>
+<span class="sourceLineNo">161</span><a name="line.161"></a>
+<span class="sourceLineNo">162</span>    public CompletedProcedureRetainer(Procedure&lt;TEnvironment&gt; procedure) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      this.procedure = procedure;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>      clientAckTime = -1;<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>    public boolean hasClientAckTime() {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>      return clientAckTime != -1;<a name="line.168"></a>
+<span class="sourceLineNo">167</span>    public Procedure&lt;TEnvironment&gt; getProcedure() {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>      return procedure;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>    }<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>    public long getClientAckTime() {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      return clientAckTime;<a name="line.172"></a>
+<span class="sourceLineNo">171</span>    public boolean hasClientAckTime() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      return clientAckTime != -1;<a name="line.172"></a>
 <span class="sourceLineNo">173</span>    }<a name="line.173"></a>
 <span class="sourceLineNo">174</span><a name="line.174"></a>
-<span class="sourceLineNo">175</span>    public void setClientAckTime(long clientAckTime) {<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      this.clientAckTime = clientAckTime;<a name="line.176"></a>
+<span class="sourceLineNo">175</span>    public long getClientAckTime() {<a name="line.175"></a>
+<span class="sourceLineNo">176</span>      return clientAckTime;<a name="line.176"></a>
 <span class="sourceLineNo">177</span>    }<a name="line.177"></a>
 <span class="sourceLineNo">178</span><a name="line.178"></a>
-<span class="sourceLineNo">179</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.180"></a>
-<span class="sourceLineNo">181</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    }<a name="line.182"></a>
-<span class="sourceLineNo">183</span>  }<a name="line.183"></a>
-<span class="sourceLineNo">184</span><a name="line.184"></a>
-<span class="sourceLineNo">185</span>  /**<a name="line.185"></a>
-<span class="sourceLineNo">186</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.186"></a>
-<span class="sourceLineNo">187</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.187"></a>
-<span class="sourceLineNo">188</span>   *<a name="line.188"></a>
-<span class="sourceLineNo">189</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.189"></a>
-<span class="sourceLineNo">190</span>   * &lt;pre&gt;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   *   procId = master.doOperation()<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * &lt;/pre&gt;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * the proc result the client will be able to get the result the next try.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   */<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.207"></a>
-<span class="sourceLineNo">208</span><a name="line.208"></a>
-<span class="sourceLineNo">209</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.209"></a>
-<span class="sourceLineNo">210</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.210"></a>
-<span class="sourceLineNo">211</span><a name="line.211"></a>
-<span class="sourceLineNo">212</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.213"></a>
-<span class="sourceLineNo">214</span><a name="line.214"></a>
-<span class="sourceLineNo">215</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    private final ProcedureStore store;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    private Configuration conf;<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.223"></a>
-<span class="sourceLineNo">224</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.224"></a>
-<span class="sourceLineNo">225</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.225"></a>
-<span class="sourceLineNo">226</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      this.completed = completedMap;<a name="line.228"></a>
-<span class="sourceLineNo">229</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      this.store = store;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      this.conf = conf;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    }<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>    @Override<a name="line.234"></a>
-<span class="sourceLineNo">235</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      if (completed.isEmpty()) {<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        if (LOG.isTraceEnabled()) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>        }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>        return;<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>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.243"></a>
-<span class="sourceLineNo">244</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.245"></a>
+<span class="sourceLineNo">179</span>    public void setClientAckTime(long clientAckTime) {<a name="line.179"></a>
+<span class="sourceLineNo">180</span>      this.clientAckTime = clientAckTime;<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    }<a name="line.181"></a>
+<span class="sourceLineNo">182</span><a name="line.182"></a>
+<span class="sourceLineNo">183</span>    public boolean isExpired(long now, long evictTtl, long evictAckTtl) {<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      return (hasClientAckTime() &amp;&amp; (now - getClientAckTime()) &gt;= evictAckTtl) ||<a name="line.184"></a>
+<span class="sourceLineNo">185</span>        (now - procedure.getLastUpdate()) &gt;= evictTtl;<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><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Internal cleaner that removes the completed procedure results after a TTL.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * NOTE: This is a special case handled in timeoutLoop().<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   *<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * &lt;p&gt;Since the client code looks more or less like:<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * &lt;pre&gt;<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   *   procId = master.doOperation()<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   *   while (master.getProcResult(procId) == ProcInProgress);<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * &lt;/pre&gt;<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * The master should not throw away the proc result as soon as the procedure is done<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * but should wait a result request from the client (see executor.removeResult(procId))<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * The client will call something like master.isProcDone() or master.getProcResult()<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * which will return the result/state to the client, and it will mark the completed<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * proc as ready to delete. note that the client may not receive the response from<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * the master (e.g. master failover) so, if we delay a bit the real deletion of<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   * the proc result the client will be able to get the result the next try.<a name="line.204"></a>
+<span class="sourceLineNo">205</span>   */<a name="line.205"></a>
+<span class="sourceLineNo">206</span>  private static class CompletedProcedureCleaner&lt;TEnvironment&gt;<a name="line.206"></a>
+<span class="sourceLineNo">207</span>      extends ProcedureInMemoryChore&lt;TEnvironment&gt; {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    private static final Logger LOG = LoggerFactory.getLogger(CompletedProcedureCleaner.class);<a name="line.208"></a>
+<span class="sourceLineNo">209</span><a name="line.209"></a>
+<span class="sourceLineNo">210</span>    private static final String CLEANER_INTERVAL_CONF_KEY = "hbase.procedure.cleaner.interval";<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    private static final int DEFAULT_CLEANER_INTERVAL = 30 * 1000; // 30sec<a name="line.211"></a>
+<span class="sourceLineNo">212</span><a name="line.212"></a>
+<span class="sourceLineNo">213</span>    private static final String EVICT_TTL_CONF_KEY = "hbase.procedure.cleaner.evict.ttl";<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    private static final int DEFAULT_EVICT_TTL = 15 * 60000; // 15min<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>    private static final String EVICT_ACKED_TTL_CONF_KEY ="hbase.procedure.cleaner.acked.evict.ttl";<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    private static final int DEFAULT_ACKED_EVICT_TTL = 5 * 60000; // 5min<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>    private static final String BATCH_SIZE_CONF_KEY = "hbase.procedure.cleaner.evict.batch.size";<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    private static final int DEFAULT_BATCH_SIZE = 32;<a name="line.220"></a>
+<span class="sourceLineNo">221</span><a name="line.221"></a>
+<span class="sourceLineNo">222</span>    private final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed;<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    private final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap;<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    private final ProcedureStore store;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    private Configuration conf;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    public CompletedProcedureCleaner(Configuration conf, final ProcedureStore store,<a name="line.227"></a>
+<span class="sourceLineNo">228</span>        final Map&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completedMap,<a name="line.228"></a>
+<span class="sourceLineNo">229</span>        final Map&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap) {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>      // set the timeout interval that triggers the periodic-procedure<a name="line.230"></a>
+<span class="sourceLineNo">231</span>      super(conf.getInt(CLEANER_INTERVAL_CONF_KEY, DEFAULT_CLEANER_INTERVAL));<a name="line.231"></a>
+<span class="sourceLineNo">232</span>      this.completed = completedMap;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      this.nonceKeysToProcIdsMap = nonceKeysToProcIdsMap;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      this.store = store;<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      this.conf = conf;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
+<span class="sourceLineNo">237</span><a name="line.237"></a>
+<span class="sourceLineNo">238</span>    @Override<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    protected void periodicExecute(final TEnvironment env) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      if (completed.isEmpty()) {<a name="line.240"></a>
+<span class="sourceLineNo">241</span>        if (LOG.isTraceEnabled()) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>          LOG.trace("No completed procedures to cleanup.");<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        }<a name="line.243"></a>
+<span class="sourceLineNo">244</span>        return;<a name="line.244"></a>
+<span class="sourceLineNo">245</span>      }<a name="line.245"></a>
 <span class="sourceLineNo">246</span><a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final long[] batchIds = new long[batchSize];<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      int batchCount = 0;<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.251"></a>
-<span class="sourceLineNo">252</span>        completed.entrySet().iterator();<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.256"></a>
-<span class="sourceLineNo">257</span><a name="line.257"></a>
-<span class="sourceLineNo">258</span>        // TODO: Select TTL based on Procedure type<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.259"></a>
-<span class="sourceLineNo">260</span>          // Failed procedures aren't persisted in WAL.<a name="line.260"></a>
-<span class="sourceLineNo">261</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>            batchIds[batchCount++] = entry.getKey();<a name="line.262"></a>
-<span class="sourceLineNo">263</span>            if (batchCount == batchIds.length) {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>              store.delete(batchIds, 0, batchCount);<a name="line.264"></a>
-<span class="sourceLineNo">265</span>              batchCount = 0;<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>
-<span class="sourceLineNo">268</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.268"></a>
-<span class="sourceLineNo">269</span>          if (nonceKey != null) {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.270"></a>
+<span class="sourceLineNo">247</span>      final long evictTtl = conf.getInt(EVICT_TTL_CONF_KEY, DEFAULT_EVICT_TTL);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>      final long evictAckTtl = conf.getInt(EVICT_ACKED_TTL_CONF_KEY, DEFAULT_ACKED_EVICT_TTL);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final int batchSize = conf.getInt(BATCH_SIZE_CONF_KEY, DEFAULT_BATCH_SIZE);<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final long[] batchIds = new long[batchSize];<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      int batchCount = 0;<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>      final long now = EnvironmentEdgeManager.currentTime();<a name="line.254"></a>
+<span class="sourceLineNo">255</span>      final Iterator&lt;Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt;&gt; it =<a name="line.255"></a>
+<span class="sourceLineNo">256</span>        completed.entrySet().iterator();<a name="line.256"></a>
+<span class="sourceLineNo">257</span>      while (it.hasNext() &amp;&amp; store.isRunning()) {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>        final Map.Entry&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; entry = it.next();<a name="line.258"></a>
+<span class="sourceLineNo">259</span>        final CompletedProcedureRetainer&lt;TEnvironment&gt; retainer = entry.getValue();<a name="line.259"></a>
+<span class="sourceLineNo">260</span>        final Procedure&lt;?&gt; proc = retainer.getProcedure();<a name="line.260"></a>
+<span class="sourceLineNo">261</span><a name="line.261"></a>
+<span class="sourceLineNo">262</span>        // TODO: Select TTL based on Procedure type<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        if (retainer.isExpired(now, evictTtl, evictAckTtl)) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>          // Failed procedures aren't persisted in WAL.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>          if (!(proc instanceof FailedProcedure)) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>            batchIds[batchCount++] = entry.getKey();<a name="line.266"></a>
+<span class="sourceLineNo">267</span>            if (batchCount == batchIds.length) {<a name="line.267"></a>
+<span class="sourceLineNo">268</span>              store.delete(batchIds, 0, batchCount);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>              batchCount = 0;<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>          it.remove();<a name="line.272"></a>
-<span class="sourceLineNo">273</span>          LOG.trace("Evict completed {}", proc);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>        }<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      }<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      if (batchCount &gt; 0) {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        store.delete(batchIds, 0, batchCount);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      }<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>  /**<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.285"></a>
-<span class="sourceLineNo">286</span>   */<a name="line.286"></a>
-<span class="sourceLineNo">287</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.291"></a>
-<span class="sourceLineNo">292</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.292"></a>
-<span class="sourceLineNo">293</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.293"></a>
-<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
-<span class="sourceLineNo">295</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   */<a name="line.301"></a>
-<span class="sourceLineNo">302</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.302"></a>
-<span class="sourceLineNo">303</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>  /**<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * contains every root procedure.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.309"></a>
-<span class="sourceLineNo">310</span><a name="line.310"></a>
-<span class="sourceLineNo">311</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.311"></a>
-<span class="sourceLineNo">312</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.312"></a>
-<span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  private Configuration conf;<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">317</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.317"></a>
-<span class="sourceLineNo">318</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.318"></a>
-<span class="sourceLineNo">319</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.319"></a>
-<span class="sourceLineNo">320</span>   * (Should be ok).<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   */<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  private ThreadGroup threadGroup;<a name="line.322"></a>
-<span class="sourceLineNo">323</span><a name="line.323"></a>
-<span class="sourceLineNo">324</span>  /**<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * (Should be ok).<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   */<a name="line.329"></a>
-<span class="sourceLineNo">330</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.330"></a>
-<span class="sourceLineNo">331</span><a name="line.331"></a>
-<span class="sourceLineNo">332</span>  /**<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   * (Should be ok).<a name="line.336"></a>
-<span class="sourceLineNo">337</span>   */<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  private int corePoolSize;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  private int maxPoolSize;<a name="line.341"></a>
-<span class="sourceLineNo">342</span><a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private volatile long keepAliveTime;<a name="line.343"></a>
-<span class="sourceLineNo">344</span><a name="line.344"></a>
-<span class="sourceLineNo">345</span>  /**<a name="line.345"></a>
-<span class="sourceLineNo">346</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.346"></a>
-<span class="sourceLineNo">347</span>   */<a name="line.347"></a>
-<span class="sourceLineNo">348</span>  private final ProcedureScheduler scheduler;<a name="line.348"></a>
-<span class="sourceLineNo">349</span><a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>  private final TEnvironment environment;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private final ProcedureStore store;<a name="line.355"></a>
+<span class="sourceLineNo">272</span>          final NonceKey nonceKey = proc.getNonceKey();<a name="line.272"></a>
+<span class="sourceLineNo">273</span>          if (nonceKey != null) {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>            nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.274"></a>
+<span class="sourceLineNo">275</span>          }<a name="line.275"></a>
+<span class="sourceLineNo">276</span>          it.remove();<a name="line.276"></a>
+<span class="sourceLineNo">277</span>          LOG.trace("Evict completed {}", proc);<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        }<a name="line.278"></a>
+<span class="sourceLineNo">279</span>      }<a name="line.279"></a>
+<span class="sourceLineNo">280</span>      if (batchCount &gt; 0) {<a name="line.280"></a>
+<span class="sourceLineNo">281</span>        store.delete(batchIds, 0, batchCount);<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      }<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    }<a name="line.283"></a>
+<span class="sourceLineNo">284</span>  }<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>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the Procedure.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * Once a Root-Procedure completes (success or failure), the result will be added to this map.<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * The user of ProcedureExecutor should call getResult(procId) to get the result.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
+<span class="sourceLineNo">291</span>  private final ConcurrentHashMap&lt;Long, CompletedProcedureRetainer&lt;TEnvironment&gt;&gt; completed =<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.292"></a>
+<span class="sourceLineNo">293</span><a name="line.293"></a>
+<span class="sourceLineNo">294</span>  /**<a name="line.294"></a>
+<span class="sourceLineNo">295</span>   * Map the the procId returned by submitProcedure(), the Root-ProcID, to the RootProcedureState.<a name="line.295"></a>
+<span class="sourceLineNo">296</span>   * The RootProcedureState contains the execution stack of the Root-Procedure,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>   * It is added to the map by submitProcedure() and removed on procedure completion.<a name="line.297"></a>
+<span class="sourceLineNo">298</span>   */<a name="line.298"></a>
+<span class="sourceLineNo">299</span>  private final ConcurrentHashMap&lt;Long, RootProcedureState&lt;TEnvironment&gt;&gt; rollbackStack =<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    new ConcurrentHashMap&lt;&gt;();<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>   * Helper map to lookup the live procedures by ID.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * This map contains every procedure. root-procedures and subprocedures.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
+<span class="sourceLineNo">306</span>  private final ConcurrentHashMap&lt;Long, Procedure&lt;TEnvironment&gt;&gt; procedures =<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    new ConcurrentHashMap&lt;&gt;();<a name="line.307"></a>
+<span class="sourceLineNo">308</span><a name="line.308"></a>
+<span class="sourceLineNo">309</span>  /**<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * Helper map to lookup whether the procedure already issued from the same client. This map<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * contains every root procedure.<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   */<a name="line.312"></a>
+<span class="sourceLineNo">313</span>  private final ConcurrentHashMap&lt;NonceKey, Long&gt; nonceKeysToProcIdsMap = new ConcurrentHashMap&lt;&gt;();<a name="line.313"></a>
+<span class="sourceLineNo">314</span><a name="line.314"></a>
+<span class="sourceLineNo">315</span>  private final CopyOnWriteArrayList&lt;ProcedureExecutorListener&gt; listeners =<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    new CopyOnWriteArrayList&lt;&gt;();<a name="line.316"></a>
+<span class="sourceLineNo">317</span><a name="line.317"></a>
+<span class="sourceLineNo">318</span>  private Configuration conf;<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>
+<span class="sourceLineNo">321</span>   * Created in the {@link #start(int, boolean)} method. Destroyed in {@link #join()} (FIX! Doing<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   * (Should be ok).<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   */<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  private ThreadGroup threadGroup;<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>  /**<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * (Should be ok).<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   */<a name="line.333"></a>
+<span class="sourceLineNo">334</span>  private CopyOnWriteArrayList&lt;WorkerThread&gt; workerThreads;<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>  /**<a name="line.336"></a>
+<span class="sourceLineNo">337</span>   * Created in the {@link #start(int, boolean)} method. Terminated in {@link #join()} (FIX! Doing<a name="line.337"></a>
+<span class="sourceLineNo">338</span>   * resource handling rather than observing in a #join is unexpected).<a name="line.338"></a>
+<span class="sourceLineNo">339</span>   * Overridden when we do the ProcedureTestingUtility.testRecoveryAndDoubleExecution trickery<a name="line.339"></a>
+<span class="sourceLineNo">340</span>   * (Should be ok).<a name="line.340"></a>
+<span class="sourceLineNo">341</span>   */<a name="line.341"></a>
+<span class="sourceLineNo">342</span>  private TimeoutExecutorThread&lt;TEnvironment&gt; timeoutExecutor;<a name="line.342"></a>
+<span class="sourceLineNo">343</span><a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private int corePoolSize;<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  private int maxPoolSize;<a name="line.345"></a>
+<span class="sourceLineNo">346</span><a name="line.346"></a>
+<span class="sourceLineNo">347</span>  private volatile long keepAliveTime;<a name="line.347"></a>
+<span class="sourceLineNo">348</span><a name="line.348"></a>
+<span class="sourceLineNo">349</span>  /**<a name="line.349"></a>
+<span class="sourceLineNo">350</span>   * Scheduler/Queue that contains runnable procedures.<a name="line.350"></a>
+<span class="sourceLineNo">351</span>   */<a name="line.351"></a>
+<span class="sourceLineNo">352</span>  private final ProcedureScheduler scheduler;<a name="line.352"></a>
+<span class="sourceLineNo">353</span><a name="line.353"></a>
+<span class="sourceLineNo">354</span>  private final Executor forceUpdateExecutor = Executors.newSingleThreadExecutor(<a name="line.354"></a>
+<span class="sourceLineNo">355</span>    new ThreadFactoryBuilder().setDaemon(true).setNameFormat("Force-Update-PEWorker-%d").build());<a name="line.355"></a>
 <span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  private final boolean checkOwnerSet;<a name="line.357"></a>
-<span class="sourceLineNo">358</span><a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // To prevent concurrent execution of the same procedure.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.360"></a>
-<span class="sourceLineNo">361</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  // execution of the same procedure.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.365"></a>
-<span class="sourceLineNo">366</span><a name="line.366"></a>
-<span class="sourceLineNo">367</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      final ProcedureStore store) {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    this(conf, environment, store, new SimpleProcedureScheduler());<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    this.environment = environment;<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    this.scheduler = scheduler;<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    this.store = store;<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    this.conf = conf;<a name="line.377"></a>
-<span class="sourceLineNo">378</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    refreshConfiguration(conf);<a name="line.379"></a>
-<span class="sourceLineNo">380</span><a name="line.380"></a>
-<span class="sourceLineNo">381</span>  }<a name="line.381"></a>
-<span class="sourceLineNo">382</span><a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.387"></a>
-<span class="sourceLineNo">388</span><a name="line.388"></a>
-<span class="sourceLineNo">389</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      @Override<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      public void setMaxProcId(long maxProcId) {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.392"></a>
-<span class="sourceLineNo">393</span>        lastProcId.set(maxProcId);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      }<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>      @Override<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      }<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>      @Override<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>        int corruptedCount = 0;<a name="line.403"></a>
-<span class="sourceLineNo">404</span>        while (procIter.hasNext()) {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>          LOG.error("Corrupt " + proc);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>          corruptedCount++;<a name="line.407"></a>
-<span class="sourceLineNo">408</span>        }<a name="line.408"></a>
-<span class="sourceLineNo">409</span>        if (abortOnCorruption &amp;&amp; corruptedCount &gt; 0) {<a name="line.409"></a>
-<span class="sourceLineNo">410</span>          throw new IOException("found " + corruptedCount + " corrupted procedure(s) on replay");<a name="line.410"></a>
-<span class="sourceLineNo">411</span>        }<a name="line.411"></a>
-<span class="sourceLineNo">412</span>      }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    });<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  private void restoreLock(Procedure&lt;TEnvironment&gt; proc, Set&lt;Long&gt; restored) {<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    proc.restoreLock(getEnvironment());<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    restored.add(proc.getProcId());<a name="line.418"></a>
+<span class="sourceLineNo">357</span>  private final AtomicLong lastProcId = new AtomicLong(-1);<a name="line.357"></a>
+<span class="sourceLineNo">358</span>  private final AtomicLong workerId = new AtomicLong(0);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>  private final AtomicInteger activeExecutorCount = new AtomicInteger(0);<a name="line.359"></a>
+<span class="sourceLineNo">360</span>  private final AtomicBoolean running = new AtomicBoolean(false);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>  private final TEnvironment environment;<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  private final ProcedureStore store;<a name="line.362"></a>
+<span class="sourceLineNo">363</span><a name="line.363"></a>
+<span class="sourceLineNo">364</span>  private final boolean checkOwnerSet;<a name="line.364"></a>
+<span class="sourceLineNo">365</span><a name="line.365"></a>
+<span class="sourceLineNo">366</span>  // To prevent concurrent execution of the same procedure.<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  // For some rare cases, especially if the procedure uses ProcedureEvent, it is possible that the<a name="line.367"></a>
+<span class="sourceLineNo">368</span>  // procedure is woken up before we finish the suspend which causes the same procedures to be<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  // executed in parallel. This does lead to some problems, see HBASE-20939&amp;HBASE-20949, and is also<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  // a bit confusing to the developers. So here we introduce this lock to prevent the concurrent<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  // execution of the same procedure.<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  private final IdLock procExecutionLock = new IdLock();<a name="line.372"></a>
+<span class="sourceLineNo">373</span><a name="line.373"></a>
+<span class="sourceLineNo">374</span>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      final ProcedureStore store) {<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    this(conf, environment, store, new SimpleProcedureScheduler());<a name="line.376"></a>
+<span class="sourceLineNo">377</span>  }<a name="line.377"></a>
+<span class="sourceLineNo">378</span><a name="line.378"></a>
+<span class="sourceLineNo">379</span>  private void forceUpdateProcedure(long procId) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    try {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      Procedure&lt;TEnvironment&gt; proc = procedures.get(procId);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (proc == null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        LOG.debug("No pending procedure with id = {}, skip force updating.", procId);<a name="line.384"></a>
+<span class="sourceLineNo">385</span>        return;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      }<a name="line.386"></a>
+<span class="sourceLineNo">387</span>      if (proc.isFinished()) {<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        LOG.debug("Procedure {} has already been finished, skip force updating.", proc);<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>      LOG.debug("Force update procedure {}", proc);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      store.update(proc);<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    } finally {<a name="line.393"></a>
+<span class="sourceLineNo">394</span>      procExecutionLock.releaseLockEntry(lockEntry);<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    }<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>  public ProcedureExecutor(final Configuration conf, final TEnvironment environment,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      final ProcedureStore store, final ProcedureScheduler scheduler) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    this.environment = environment;<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    this.scheduler = scheduler;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    this.store = store;<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    this.conf = conf;<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    this.checkOwnerSet = conf.getBoolean(CHECK_OWNER_SET_CONF_KEY, DEFAULT_CHECK_OWNER_SET);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    refreshConfiguration(conf);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    store.registerListener(new ProcedureStoreListener() {<a name="line.406"></a>
+<span class="sourceLineNo">407</span><a name="line.407"></a>
+<span class="sourceLineNo">408</span>      @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      public void forceUpdate(long[] procIds) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>        Arrays.stream(procIds).forEach(procId -&gt; forceUpdateExecutor.execute(() -&gt; {<a name="line.410"></a>
+<span class="sourceLineNo">411</span>          try {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>            forceUpdateProcedure(procId);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>          } catch (IOException e) {<a name="line.413"></a>
+<span class="sourceLineNo">414</span>            LOG.warn("Failed to force update procedure with pid={}", procId);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>          }<a name="line.415"></a>
+<span class="sourceLineNo">416</span>        }));<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      }<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    });<a name="line.418"></a>
 <span class="sourceLineNo">419</span>  }<a name="line.419"></a>
 <span class="sourceLineNo">420</span><a name="line.420"></a>
-<span class="sourceLineNo">421</span>  private void restoreLocks(Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack, Set&lt;Long&gt; restored) {<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    while (!stack.isEmpty()) {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      restoreLock(stack.pop(), restored);<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">421</span>  private void load(final boolean abortOnCorruption) throws IOException {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    Preconditions.checkArgument(completed.isEmpty(), "completed not empty");<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    Preconditions.checkArgument(rollbackStack.isEmpty(), "rollback state not empty");<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    Preconditions.checkArgument(procedures.isEmpty(), "procedure map not empty");<a name="line.424"></a>
+<span class="sourceLineNo">425</span>    Preconditions.checkArgument(scheduler.size() == 0, "run queue not empty");<a name="line.425"></a>
 <span class="sourceLineNo">426</span><a name="line.426"></a>
-<span class="sourceLineNo">427</span>  // Restore the locks for all the procedures.<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  // Notice that we need to restore the locks starting from the root proc, otherwise there will be<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  // problem that a sub procedure may hold the exclusive lock first and then we are stuck when<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  // calling the acquireLock method for the parent procedure.<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // The algorithm is straight-forward:<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  // 1. Use a set to record the procedures which locks have already been restored.<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  // 2. Use a stack to store the hierarchy of the procedures<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  // 3. For all the procedure, we will first try to find its parent and push it into the stack,<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  // unless<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  // a. We have no parent, i.e, we are the root procedure<a name="line.436"></a>
-<span class="sourceLineNo">437</span>  // b. The lock has already been restored(by checking the set introduced in #1)<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  // then we start to pop the stack and call acquireLock for each procedure.<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  // Notice that this should be done for all procedures, not only the ones in runnableList.<a name="line.439"></a>
-<span class="sourceLineNo">440</span>  private void restoreLocks() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Set&lt;Long&gt; restored = new HashSet&lt;&gt;();<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    Deque&lt;Procedure&lt;TEnvironment&gt;&gt; stack = new ArrayDeque&lt;&gt;();<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    procedures.values().forEach(proc -&gt; {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      for (;;) {<a name="line.444"></a>
-<span class="sourceLineNo">445</span>        if (restored.contains(proc.getProcId())) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>          restoreLocks(stack, restored);<a name="line.446"></a>
-<span class="sourceLineNo">447</span>          return;<a name="line.447"></a>
-<span class="sourceLineNo">448</span>        }<a name="line.448"></a>
-<span class="sourceLineNo">449</span>        if (!proc.hasParent()) {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          restoreLock(proc, restored);<a name="line.450"></a>
-<span class="sourceLineNo">451</span>          restoreLocks(stack, restored);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          return;<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        }<a name="line.453"></a>
-<span class="sourceLineNo">454</span>        stack.push(proc);<a name="line.454"></a>
-<span class="sourceLineNo">455</span>        proc = procedures.get(proc.getParentProcId());<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      }<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    });<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  }<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>  private void loadProcedures(ProcedureIterator procIter, boolean abortOnCorruption)<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      throws IOException {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>    // 1. Build the rollback stack<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    int runnablesCount = 0;<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    int failedCount = 0;<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    while (procIter.hasNext()) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      boolean finished = procIter.isNextFinished();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      @SuppressWarnings("unchecked")<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      Procedure&lt;TEnvironment&gt; proc = procIter.next();<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      NonceKey nonceKey = proc.getNonceKey();<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      long procId = proc.getProcId();<a name="line.470"></a>
-<span class="sourceLineNo">471</span><a name="line.471"></a>
-<span class="sourceLineNo">472</span>      if (finished) {<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        completed.put(proc.getProcId(), new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        LOG.debug("Completed {}", proc);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      } else {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>        if (!proc.hasParent()) {<a name="line.476"></a>
-<span class="sourceLineNo">477</span>          assert !proc.isFinished() : "unexpected finished procedure";<a name="line.477"></a>
-<span class="sourceLineNo">478</span>          rollbackStack.put(proc.getProcId(), new RootProcedureState&lt;&gt;());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        }<a name="line.479"></a>
-<span class="sourceLineNo">480</span><a name="line.480"></a>
-<span class="sourceLineNo">481</span>        // add the procedure to the map<a name="line.481"></a>
-<span class="sourceLineNo">482</span>        proc.beforeReplay(getEnvironment());<a name="line.482"></a>
-<span class="sourceLineNo">483</span>        procedures.put(proc.getProcId(), proc);<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>        if (proc.getState() == ProcedureState.RUNNABLE) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>          runnablesCount++;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>        } else if (proc.getState() == ProcedureState.FAILED) {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>          failedCount++;<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><a name="line.491"></a>
-<span class="sourceLineNo">492</span>      // add the nonce to the map<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      if (nonceKey != null) {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        nonceKeysToProcIdsMap.put(nonceKey, procId);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>      }<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    }<a name="line.496"></a>
+<span class="sourceLineNo">427</span>    store.load(new ProcedureStore.ProcedureLoader() {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      @Override<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      public void setMaxProcId(long maxProcId) {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>        assert lastProcId.get() &lt; 0 : "expected only one call to setMaxProcId()";<a name="line.430"></a>
+<span class="sourceLineNo">431</span>        lastProcId.set(maxProcId);<a name="line.431"></a>
+<span class="sourceLineNo">432</span>      }<a name="line.432"></a>
+<span class="sourceLineNo">433</span><a name="line.433"></a>
+<span class="sourceLineNo">434</span>      @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      public void load(ProcedureIterator procIter) throws IOException {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        loadProcedures(procIter, abortOnCorruption);<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      }<a name="line.437"></a>
+<span class="sourceLineNo">438</span><a name="line.438"></a>
+<span class="sourceLineNo">439</span>      @Override<a name="line.439"></a>
+<span class="sourceLineNo">440</span>      public void handleCorrupted(ProcedureIterator procIter) throws IOException {<a name="line.440"></a>
+<span class="sourceLineNo">441</span>        int corruptedCount = 0;<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        while (procIter.hasNext()) {<a name="line.442"></a>
+<span class="sourceLineNo">443</span>          Procedure&lt;?&gt; proc = procIter.next();<a name="line.443"></a>
+<span class="sourceLineNo">444</span>          LOG.error("Corrupt " + proc);<a name="line.444"></a>
+<span class="sourceLineNo">445</span>          corruptedCount++;<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        }<a name="line.446"></a>
+<span class="source

<TRUNCATED>

[47/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/master/HMaster.html b/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
index 57264db..a6969be 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/HMaster.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value="Tools")
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.253">HMaster</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.254">HMaster</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>
 implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></pre>
 <div class="block">HMaster is the "master server" for HBase. An HBase cluster has one active
@@ -1535,7 +1535,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <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/HMaster.html#line.254">LOG</a></pre>
+<pre>private static&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.255">LOG</a></pre>
 </li>
 </ul>
 <a name="MASTER">
@@ -1544,7 +1544,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>MASTER</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/master/HMaster.html#line.310">MASTER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.311">MASTER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.MASTER">Constant Field Values</a></dd>
@@ -1557,7 +1557,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>activeMasterManager</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">ActiveMasterManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.313">activeMasterManager</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ActiveMasterManager.html" title="class in org.apache.hadoop.hbase.master">ActiveMasterManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.314">activeMasterManager</a></pre>
 </li>
 </ul>
 <a name="regionServerTracker">
@@ -1566,7 +1566,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>regionServerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RegionServerTracker.html" title="class in org.apache.hadoop.hbase.master">RegionServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.315">regionServerTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/RegionServerTracker.html" title="class in org.apache.hadoop.hbase.master">RegionServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.316">regionServerTracker</a></pre>
 </li>
 </ul>
 <a name="drainingServerTracker">
@@ -1575,7 +1575,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>drainingServerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/DrainingServerTracker.html" title="class in org.apache.hadoop.hbase.master">DrainingServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.317">drainingServerTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/DrainingServerTracker.html" title="class in org.apache.hadoop.hbase.master">DrainingServerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.318">drainingServerTracker</a></pre>
 </li>
 </ul>
 <a name="loadBalancerTracker">
@@ -1584,7 +1584,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>loadBalancerTracker</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/LoadBalancerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">LoadBalancerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.319">loadBalancerTracker</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/zookeeper/LoadBalancerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">LoadBalancerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.320">loadBalancerTracker</a></pre>
 </li>
 </ul>
 <a name="metaLocationSyncer">
@@ -1593,7 +1593,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>metaLocationSyncer</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MetaLocationSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MetaLocationSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.321">metaLocationSyncer</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MetaLocationSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MetaLocationSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.322">metaLocationSyncer</a></pre>
 </li>
 </ul>
 <a name="masterAddressSyncer">
@@ -1602,7 +1602,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterAddressSyncer</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MasterAddressSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MasterAddressSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.323">masterAddressSyncer</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/zksyncer/MasterAddressSyncer.html" title="class in org.apache.hadoop.hbase.master.zksyncer">MasterAddressSyncer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.324">masterAddressSyncer</a></pre>
 </li>
 </ul>
 <a name="splitOrMergeTracker">
@@ -1611,7 +1611,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>splitOrMergeTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/SplitOrMergeTracker.html" title="class in org.apache.hadoop.hbase.master">SplitOrMergeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.326">splitOrMergeTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/SplitOrMergeTracker.html" title="class in org.apache.hadoop.hbase.master">SplitOrMergeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.327">splitOrMergeTracker</a></pre>
 </li>
 </ul>
 <a name="regionNormalizerTracker">
@@ -1620,7 +1620,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>regionNormalizerTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/RegionNormalizerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">RegionNormalizerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.329">regionNormalizerTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/RegionNormalizerTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">RegionNormalizerTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.330">regionNormalizerTracker</a></pre>
 </li>
 </ul>
 <a name="maintenanceModeTracker">
@@ -1629,7 +1629,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>maintenanceModeTracker</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.332">maintenanceModeTracker</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/zookeeper/MasterMaintenanceModeTracker.html" title="class in org.apache.hadoop.hbase.zookeeper">MasterMaintenanceModeTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.333">maintenanceModeTracker</a></pre>
 </li>
 </ul>
 <a name="clusterSchemaService">
@@ -1638,7 +1638,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterSchemaService</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterSchemaService.html" title="interface in org.apache.hadoop.hbase.master">ClusterSchemaService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.334">clusterSchemaService</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterSchemaService.html" title="interface in org.apache.hadoop.hbase.master">ClusterSchemaService</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.335">clusterSchemaService</a></pre>
 </li>
 </ul>
 <a name="HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">
@@ -1647,7 +1647,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</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/master/HMaster.html#line.336">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.337">HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">Constant Field Values</a></dd>
@@ -1660,7 +1660,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</h4>
-<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.338">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.339">DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.master.HMaster.DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS">Constant Field Values</a></dd>
@@ -1673,7 +1673,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>metricsMaster</h4>
-<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.341">metricsMaster</a></pre>
+<pre>final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.342">metricsMaster</a></pre>
 </li>
 </ul>
 <a name="fileSystemManager">
@@ -1682,7 +1682,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>fileSystemManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.343">fileSystemManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.344">fileSystemManager</a></pre>
 </li>
 </ul>
 <a name="walManager">
@@ -1691,7 +1691,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>walManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.344">walManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.345">walManager</a></pre>
 </li>
 </ul>
 <a name="serverManager">
@@ -1700,7 +1700,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>serverManager</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.347">serverManager</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.348">serverManager</a></pre>
 </li>
 </ul>
 <a name="assignmentManager">
@@ -1709,7 +1709,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>assignmentManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.350">assignmentManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.351">assignmentManager</a></pre>
 </li>
 </ul>
 <a name="replicationPeerManager">
@@ -1718,7 +1718,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>replicationPeerManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.353">replicationPeerManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/ReplicationPeerManager.html" title="class in org.apache.hadoop.hbase.master.replication">ReplicationPeerManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.354">replicationPeerManager</a></pre>
 </li>
 </ul>
 <a name="syncReplicationReplayWALManager">
@@ -1727,7 +1727,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>syncReplicationReplayWALManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.355">syncReplicationReplayWALManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/replication/SyncReplicationReplayWALManager.html" title="class in org.apache.hadoop.hbase.master.replication">SyncReplicationReplayWALManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.356">syncReplicationReplayWALManager</a></pre>
 </li>
 </ul>
 <a name="rsFatals">
@@ -1736,7 +1736,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>rsFatals</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.360">rsFatals</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/monitoring/MemoryBoundedLogMessageBuffer.html" title="class in org.apache.hadoop.hbase.monitoring">MemoryBoundedLogMessageBuffer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.361">rsFatals</a></pre>
 </li>
 </ul>
 <a name="activeMaster">
@@ -1745,7 +1745,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>activeMaster</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.363">activeMaster</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.364">activeMaster</a></pre>
 </li>
 </ul>
 <a name="initialized">
@@ -1754,7 +1754,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initialized</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.366">initialized</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureEvent.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureEvent</a>&lt;?&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.367">initialized</a></pre>
 </li>
 </ul>
 <a name="serviceStarted">
@@ -1763,7 +1763,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>serviceStarted</h4>
-<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.370">serviceStarted</a></pre>
+<pre>volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.371">serviceStarted</a></pre>
 </li>
 </ul>
 <a name="maxBlancingTime">
@@ -1772,7 +1772,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>maxBlancingTime</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.373">maxBlancingTime</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.374">maxBlancingTime</a></pre>
 </li>
 </ul>
 <a name="maxRitPercent">
@@ -1781,7 +1781,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>maxRitPercent</h4>
-<pre>private final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.375">maxRitPercent</a></pre>
+<pre>private final&nbsp;double <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.376">maxRitPercent</a></pre>
 </li>
 </ul>
 <a name="lockManager">
@@ -1790,7 +1790,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>lockManager</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/locking/LockManager.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.377">lockManager</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/locking/LockManager.html" title="class in org.apache.hadoop.hbase.master.locking">LockManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.378">lockManager</a></pre>
 </li>
 </ul>
 <a name="balancer">
@@ -1799,7 +1799,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balancer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.379">balancer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/LoadBalancer.html" title="interface in org.apache.hadoop.hbase.master">LoadBalancer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.380">balancer</a></pre>
 </li>
 </ul>
 <a name="normalizer">
@@ -1808,7 +1808,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>normalizer</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.380">normalizer</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizer.html" title="interface in org.apache.hadoop.hbase.master.normalizer">RegionNormalizer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.381">normalizer</a></pre>
 </li>
 </ul>
 <a name="balancerChore">
@@ -1817,7 +1817,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balancerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/BalancerChore.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.381">balancerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/BalancerChore.html" title="class in org.apache.hadoop.hbase.master.balancer">BalancerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.382">balancerChore</a></pre>
 </li>
 </ul>
 <a name="normalizerChore">
@@ -1826,7 +1826,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>normalizerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.382">normalizerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.html" title="class in org.apache.hadoop.hbase.master.normalizer">RegionNormalizerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.383">normalizerChore</a></pre>
 </li>
 </ul>
 <a name="clusterStatusChore">
@@ -1835,7 +1835,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatusChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.html" title="class in org.apache.hadoop.hbase.master.balancer">ClusterStatusChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.383">clusterStatusChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.html" title="class in org.apache.hadoop.hbase.master.balancer">ClusterStatusChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.384">clusterStatusChore</a></pre>
 </li>
 </ul>
 <a name="clusterStatusPublisherChore">
@@ -1844,7 +1844,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>clusterStatusPublisherChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">ClusterStatusPublisher</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.384">clusterStatusPublisherChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ClusterStatusPublisher.html" title="class in org.apache.hadoop.hbase.master">ClusterStatusPublisher</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.385">clusterStatusPublisherChore</a></pre>
 </li>
 </ul>
 <a name="catalogJanitorChore">
@@ -1853,7 +1853,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>catalogJanitorChore</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.386">catalogJanitorChore</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/CatalogJanitor.html" title="class in org.apache.hadoop.hbase.master">CatalogJanitor</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.387">catalogJanitorChore</a></pre>
 </li>
 </ul>
 <a name="logCleaner">
@@ -1862,7 +1862,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>logCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/LogCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">LogCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.387">logCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/LogCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">LogCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.388">logCleaner</a></pre>
 </li>
 </ul>
 <a name="hfileCleaner">
@@ -1871,7 +1871,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>hfileCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">HFileCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.388">hfileCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/HFileCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">HFileCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.389">hfileCleaner</a></pre>
 </li>
 </ul>
 <a name="replicationBarrierCleaner">
@@ -1880,7 +1880,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>replicationBarrierCleaner</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">ReplicationBarrierCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.389">replicationBarrierCleaner</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/cleaner/ReplicationBarrierCleaner.html" title="class in org.apache.hadoop.hbase.master.cleaner">ReplicationBarrierCleaner</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.390">replicationBarrierCleaner</a></pre>
 </li>
 </ul>
 <a name="expiredMobFileCleanerChore">
@@ -1889,7 +1889,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>expiredMobFileCleanerChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.html" title="class in org.apache.hadoop.hbase.master">ExpiredMobFileCleanerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.390">expiredMobFileCleanerChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.html" title="class in org.apache.hadoop.hbase.master">ExpiredMobFileCleanerChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.391">expiredMobFileCleanerChore</a></pre>
 </li>
 </ul>
 <a name="mobCompactChore">
@@ -1898,7 +1898,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MobCompactionChore.html" title="class in org.apache.hadoop.hbase.master">MobCompactionChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.391">mobCompactChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MobCompactionChore.html" title="class in org.apache.hadoop.hbase.master">MobCompactionChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.392">mobCompactChore</a></pre>
 </li>
 </ul>
 <a name="mobCompactThread">
@@ -1907,7 +1907,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactThread</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMobCompactionThread.html" title="class in org.apache.hadoop.hbase.master">MasterMobCompactionThread</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.392">mobCompactThread</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMobCompactionThread.html" title="class in org.apache.hadoop.hbase.master">MasterMobCompactionThread</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.393">mobCompactThread</a></pre>
 </li>
 </ul>
 <a name="mobCompactionLock">
@@ -1916,7 +1916,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactionLock</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.394">mobCompactionLock</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/IdLock.html" title="class in org.apache.hadoop.hbase.util">IdLock</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.395">mobCompactionLock</a></pre>
 </li>
 </ul>
 <a name="mobCompactionStates">
@@ -1925,7 +1925,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mobCompactionStates</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.397">mobCompactionStates</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>,<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicInteger</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.398">mobCompactionStates</a></pre>
 </li>
 </ul>
 <a name="cpHost">
@@ -1934,7 +1934,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>cpHost</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.399">cpHost</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/MasterCoprocessorHost.html" title="class in org.apache.hadoop.hbase.master">MasterCoprocessorHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.400">cpHost</a></pre>
 </li>
 </ul>
 <a name="preLoadTableDescriptors">
@@ -1943,7 +1943,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>preLoadTableDescriptors</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.401">preLoadTableDescriptors</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.402">preLoadTableDescriptors</a></pre>
 </li>
 </ul>
 <a name="masterActiveTime">
@@ -1952,7 +1952,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterActiveTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.404">masterActiveTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.405">masterActiveTime</a></pre>
 </li>
 </ul>
 <a name="masterFinishedInitializationTime">
@@ -1961,7 +1961,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterFinishedInitializationTime</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.407">masterFinishedInitializationTime</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.408">masterFinishedInitializationTime</a></pre>
 </li>
 </ul>
 <a name="masterCheckCompression">
@@ -1970,7 +1970,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterCheckCompression</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.410">masterCheckCompression</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.411">masterCheckCompression</a></pre>
 </li>
 </ul>
 <a name="masterCheckEncryption">
@@ -1979,7 +1979,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterCheckEncryption</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.413">masterCheckEncryption</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.414">masterCheckEncryption</a></pre>
 </li>
 </ul>
 <a name="coprocessorServiceHandlers">
@@ -1988,7 +1988,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>coprocessorServiceHandlers</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.415">coprocessorServiceHandlers</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,com.google.protobuf.Service&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.416">coprocessorServiceHandlers</a></pre>
 </li>
 </ul>
 <a name="snapshotManager">
@@ -1997,7 +1997,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotManager</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.418">snapshotManager</a></pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/master/snapshot/SnapshotManager.html" title="class in org.apache.hadoop.hbase.master.snapshot">SnapshotManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.419">snapshotManager</a></pre>
 </li>
 </ul>
 <a name="mpmHost">
@@ -2006,7 +2006,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mpmHost</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.420">mpmHost</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.421">mpmHost</a></pre>
 </li>
 </ul>
 <a name="quotaManager">
@@ -2015,7 +2015,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>quotaManager</h4>
-<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.423">quotaManager</a></pre>
+<pre>private volatile&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/MasterQuotaManager.html" title="class in org.apache.hadoop.hbase.quotas">MasterQuotaManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.424">quotaManager</a></pre>
 </li>
 </ul>
 <a name="spaceQuotaSnapshotNotifier">
@@ -2024,7 +2024,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>spaceQuotaSnapshotNotifier</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.424">spaceQuotaSnapshotNotifier</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.425">spaceQuotaSnapshotNotifier</a></pre>
 </li>
 </ul>
 <a name="quotaObserverChore">
@@ -2033,7 +2033,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>quotaObserverChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.425">quotaObserverChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">QuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.426">quotaObserverChore</a></pre>
 </li>
 </ul>
 <a name="snapshotQuotaChore">
@@ -2042,7 +2042,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshotQuotaChore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">SnapshotQuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.426">snapshotQuotaChore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SnapshotQuotaObserverChore.html" title="class in org.apache.hadoop.hbase.quotas">SnapshotQuotaObserverChore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.427">snapshotQuotaChore</a></pre>
 </li>
 </ul>
 <a name="procedureExecutor">
@@ -2051,7 +2051,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureExecutor</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.428">procedureExecutor</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.429">procedureExecutor</a></pre>
 </li>
 </ul>
 <a name="procedureStore">
@@ -2060,7 +2060,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureStore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.429">procedureStore</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.430">procedureStore</a></pre>
 </li>
 </ul>
 <a name="tableStateManager">
@@ -2069,7 +2069,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>tableStateManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.432">tableStateManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.433">tableStateManager</a></pre>
 </li>
 </ul>
 <a name="splitPlanCount">
@@ -2078,7 +2078,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>splitPlanCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.434">splitPlanCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.435">splitPlanCount</a></pre>
 </li>
 </ul>
 <a name="mergePlanCount">
@@ -2087,7 +2087,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>mergePlanCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.435">mergePlanCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.436">mergePlanCount</a></pre>
 </li>
 </ul>
 <a name="favoredNodesManager">
@@ -2096,7 +2096,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>favoredNodesManager</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.438">favoredNodesManager</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/favored/FavoredNodesManager.html" title="class in org.apache.hadoop.hbase.favored">FavoredNodesManager</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.439">favoredNodesManager</a></pre>
 </li>
 </ul>
 <a name="masterJettyServer">
@@ -2105,7 +2105,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>masterJettyServer</h4>
-<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.441">masterJettyServer</a></pre>
+<pre>private&nbsp;org.eclipse.jetty.server.Server <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.442">masterJettyServer</a></pre>
 <div class="block">jetty server for master to redirect requests to regionserver infoServer</div>
 </li>
 </ul>
@@ -2115,7 +2115,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockListLast">
 <li class="blockList">
 <h4>UNSUPPORTED_PROCEDURES</h4>
-<pre>private static final&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<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;?&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.810">UNSUPPORTED_PROCEDURES</a></pre>
+<pre>private static final&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet&lt;<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;?&gt;&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.811">UNSUPPORTED_PROCEDURES</a></pre>
 </li>
 </ul>
 </li>
@@ -2132,7 +2132,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HMaster</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.497">HMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.498">HMaster</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
         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>,
                org.apache.zookeeper.KeeperException</pre>
 <div class="block">Initializes the HMaster. The steps are as follows:
@@ -2166,7 +2166,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getUseThisHostnameInstead</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.568">getUseThisHostnameInstead</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.569">getUseThisHostnameInstead</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getUseThisHostnameInstead-org.apache.hadoop.conf.Configuration-">getUseThisHostnameInstead</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2179,7 +2179,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.575">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.576">run</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from class:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#run--">HRegionServer</a></code></span></div>
 <div class="block">The HRegionServer sticks in this loop until closed.</div>
 <dl>
@@ -2196,7 +2196,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>putUpJettyServer</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.613">putUpJettyServer</a>()
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.614">putUpJettyServer</a>()
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2210,7 +2210,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaTableObserver</h4>
-<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>,<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.663">getMetaTableObserver</a>()</pre>
+<pre>protected&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html?is-external=true" title="class or interface in java.util.function">Function</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>,<a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptorBuilder.html" title="class in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.664">getMetaTableObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getMetaTableObserver--">getMetaTableObserver</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2223,7 +2223,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>login</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.670">login</a>(<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a>&nbsp;user,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.671">login</a>(<a href="../../../../../org/apache/hadoop/hbase/security/UserProvider.html" title="class in org.apache.hadoop.hbase.security">UserProvider</a>&nbsp;user,
                      <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;host)
               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">For compatibility, if failed with regionserver credentials, try the master one</div>
@@ -2241,7 +2241,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForMasterActive</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.685">waitForMasterActive</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.686">waitForMasterActive</a>()</pre>
 <div class="block">If configured to put regions on active master,
  wait till a backup master becomes active.
  Otherwise, loop till the server is stopped or aborted.</div>
@@ -2257,7 +2257,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterRpcServices</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.html" title="class in org.apache.hadoop.hbase.master">MasterRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.693">getMasterRpcServices</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.html" title="class in org.apache.hadoop.hbase.master">MasterRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.694">getMasterRpcServices</a>()</pre>
 </li>
 </ul>
 <a name="balanceSwitch-boolean-">
@@ -2266,7 +2266,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>balanceSwitch</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.697">balanceSwitch</a>(boolean&nbsp;b)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.698">balanceSwitch</a>(boolean&nbsp;b)
                       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>
@@ -2280,7 +2280,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcessName</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.702">getProcessName</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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.703">getProcessName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getProcessName--">getProcessName</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2293,7 +2293,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>canCreateBaseZNode</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.707">canCreateBaseZNode</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.708">canCreateBaseZNode</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#canCreateBaseZNode--">canCreateBaseZNode</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2306,7 +2306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>canUpdateTableDescriptor</h4>
-<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.712">canUpdateTableDescriptor</a>()</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.713">canUpdateTableDescriptor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#canUpdateTableDescriptor--">canUpdateTableDescriptor</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2319,7 +2319,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createRpcServices</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.717">createRpcServices</a>()
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RSRpcServices.html" title="class in org.apache.hadoop.hbase.regionserver">RSRpcServices</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.718">createRpcServices</a>()
                                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -2335,7 +2335,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>configureInfoServer</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.722">configureInfoServer</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.723">configureInfoServer</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#configureInfoServer--">configureInfoServer</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2348,7 +2348,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getDumpServlet</h4>
-<pre>protected&nbsp;<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;? extends javax.servlet.http.HttpServlet&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.731">getDumpServlet</a>()</pre>
+<pre>protected&nbsp;<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;? extends javax.servlet.http.HttpServlet&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.732">getDumpServlet</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html#getDumpServlet--">getDumpServlet</a></code>&nbsp;in class&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a></code></dd>
@@ -2361,7 +2361,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterMetrics</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.736">getMasterMetrics</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMaster.html" title="class in org.apache.hadoop.hbase.master">MetricsMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.737">getMasterMetrics</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterMetrics--">getMasterMetrics</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2376,7 +2376,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeZKBasedSystemTrackers</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.750">initializeZKBasedSystemTrackers</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.751">initializeZKBasedSystemTrackers</a>()
                                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                                <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>,
                                                org.apache.zookeeper.KeeperException,
@@ -2403,7 +2403,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>checkUnsupportedProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.820">checkUnsupportedProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;,<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/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;&gt;&gt;&nbsp;procsByType)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.821">checkUnsupportedProcedure</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.html" title="class in org.apache.hadoop.hbase.procedure2">Procedure</a>&gt;,<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/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;&gt;&gt;&nbsp;procsByType)
                                 throws <a href="../../../../../org/apache/hadoop/hbase/HBaseIOException.html" title="class in org.apache.hadoop.hbase">HBaseIOException</a></pre>
 <div class="block">In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is
  incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to
@@ -2421,7 +2421,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createAssignmentManager</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.851">createAssignmentManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/assignment/AssignmentManager.html" title="class in org.apache.hadoop.hbase.master.assignment">AssignmentManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.852">createAssignmentManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)</pre>
 </li>
 </ul>
 <a name="finishActiveMasterInitialization-org.apache.hadoop.hbase.monitoring.MonitoredTask-">
@@ -2430,7 +2430,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>finishActiveMasterInitialization</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.892">finishActiveMasterInitialization</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.893">finishActiveMasterInitialization</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                                        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>,
                                               org.apache.zookeeper.KeeperException,
@@ -2485,7 +2485,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilMetaOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1179">waitUntilMetaOnline</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1180">waitUntilMetaOnline</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>
 <div class="block">Check hbase:meta is up and ready for reading. For use during Master startup only.</div>
 <dl>
@@ -2503,7 +2503,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isRegionOnline</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1187">isRegionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;ri)
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1188">isRegionOnline</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;ri)
                         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="returnLabel">Returns:</span></dt>
@@ -2520,7 +2520,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitUntilNamespaceOnline</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1220">waitUntilNamespaceOnline</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1221">waitUntilNamespaceOnline</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>
 <div class="block">Check hbase:namespace table is assigned. If not, startup will hang looking for the ns table
  (TODO: Fix this! NS should not hold-up startup).</div>
@@ -2538,7 +2538,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>updateConfigurationForQuotasObserver</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1240">updateConfigurationForQuotasObserver</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1241">updateConfigurationForQuotasObserver</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Adds the <code>MasterQuotasObserver</code> to the list of configured Master observers to
  automatically remove quotas for a table when that table is deleted.</div>
 </li>
@@ -2549,7 +2549,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initMobCleaner</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1257">initMobCleaner</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1258">initMobCleaner</a>()</pre>
 </li>
 </ul>
 <a name="createMetaBootstrap--">
@@ -2558,7 +2558,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createMetaBootstrap</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master">MasterMetaBootstrap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1282">createMetaBootstrap</a>()</pre>
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master">MasterMetaBootstrap</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1283">createMetaBootstrap</a>()</pre>
 <div class="block"><p>
  Create a <a href="../../../../../org/apache/hadoop/hbase/master/MasterMetaBootstrap.html" title="class in org.apache.hadoop.hbase.master"><code>MasterMetaBootstrap</code></a> instance.
  </p>
@@ -2573,7 +2573,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createServerManager</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1297">createServerManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1298">createServerManager</a>(<a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a>&nbsp;master)
                                      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"><p>
  Create a <a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master"><code>ServerManager</code></a> instance.
@@ -2593,7 +2593,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForRegionServers</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1304">waitForRegionServers</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1305">waitForRegionServers</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
                            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>
 <dl>
@@ -2609,7 +2609,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initClusterSchemaService</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1311">initClusterSchemaService</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1312">initClusterSchemaService</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                         <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>
@@ -2625,7 +2625,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>initQuotaManager</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1323">initQuotaManager</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1324">initQuotaManager</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2639,7 +2639,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>createQuotaSnapshotNotifier</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1329">createQuotaSnapshotNotifier</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceQuotaSnapshotNotifier.html" title="interface in org.apache.hadoop.hbase.quotas">SpaceQuotaSnapshotNotifier</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1330">createQuotaSnapshotNotifier</a>()</pre>
 </li>
 </ul>
 <a name="isCatalogJanitorEnabled--">
@@ -2648,7 +2648,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isCatalogJanitorEnabled</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1335">isCatalogJanitorEnabled</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1336">isCatalogJanitorEnabled</a>()</pre>
 </li>
 </ul>
 <a name="isCleanerChoreEnabled--">
@@ -2657,7 +2657,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>isCleanerChoreEnabled</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1340">isCleanerChoreEnabled</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1341">isCleanerChoreEnabled</a>()</pre>
 </li>
 </ul>
 <a name="getServerManager--">
@@ -2666,7 +2666,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getServerManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1355">getServerManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.html" title="class in org.apache.hadoop.hbase.master">ServerManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1356">getServerManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getServerManager--">getServerManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2681,7 +2681,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1360">getMasterFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterFileSystem.html" title="class in org.apache.hadoop.hbase.master">MasterFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1361">getMasterFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterFileSystem--">getMasterFileSystem</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2696,7 +2696,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getMasterWalManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1365">getMasterWalManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/MasterWalManager.html" title="class in org.apache.hadoop.hbase.master">MasterWalManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1366">getMasterWalManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getMasterWalManager--">getMasterWalManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2711,7 +2711,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableStateManager</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1370">getTableStateManager</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/TableStateManager.html" title="class in org.apache.hadoop.hbase.master">TableStateManager</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1371">getTableStateManager</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html#getTableStateManager--">getTableStateManager</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/master/MasterServices.html" title="interface in org.apache.hadoop.hbase.master">MasterServices</a></code></dd>
@@ -2726,7 +2726,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/master/MasterServices
 <ul class="blockList">
 <li class="blockList">
 <h4>startServiceThreads</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/master/HMaster.html#line.1381">startServiceThreads</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-ht

<TRUNCATED>

[34/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
index 721035e..f808b16 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/master/HMaster.TableDescriptorGetter.html
@@ -169,3778 +169,3785 @@
 <span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;<a name="line.161"></a>
 <span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteProcedure;<a name="line.162"></a>
 <span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.procedure2.RemoteProcedureException;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.quotas.MasterQuotaManager;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.quotas.MasterQuotasObserver;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.quotas.QuotaObserverChore;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.quotas.QuotaUtil;<a name="line.168"></a>
-<span class="sourceLineNo">169</span>import org.apache.hadoop.hbase.quotas.SnapshotQuotaObserverChore;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifier;<a name="line.170"></a>
-<span class="sourceLineNo">171</span>import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshotNotifierFactory;<a name="line.171"></a>
-<span class="sourceLineNo">172</span>import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;<a name="line.172"></a>
-<span class="sourceLineNo">173</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>import org.apache.hadoop.hbase.regionserver.RSRpcServices;<a name="line.175"></a>
-<span class="sourceLineNo">176</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.176"></a>
-<span class="sourceLineNo">177</span>import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;<a name="line.177"></a>
-<span class="sourceLineNo">178</span>import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;<a name="line.178"></a>
-<span class="sourceLineNo">179</span>import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;<a name="line.179"></a>
-<span class="sourceLineNo">180</span>import org.apache.hadoop.hbase.replication.ReplicationException;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>import org.apache.hadoop.hbase.replication.ReplicationLoadSource;<a name="line.181"></a>
-<span class="sourceLineNo">182</span>import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;<a name="line.182"></a>
-<span class="sourceLineNo">183</span>import org.apache.hadoop.hbase.replication.ReplicationPeerDescription;<a name="line.183"></a>
-<span class="sourceLineNo">184</span>import org.apache.hadoop.hbase.replication.ReplicationUtils;<a name="line.184"></a>
-<span class="sourceLineNo">185</span>import org.apache.hadoop.hbase.replication.SyncReplicationState;<a name="line.185"></a>
-<span class="sourceLineNo">186</span>import org.apache.hadoop.hbase.replication.master.ReplicationHFileCleaner;<a name="line.186"></a>
-<span class="sourceLineNo">187</span>import org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>import org.apache.hadoop.hbase.replication.master.ReplicationPeerConfigUpgrader;<a name="line.188"></a>
-<span class="sourceLineNo">189</span>import org.apache.hadoop.hbase.security.AccessDeniedException;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>import org.apache.hadoop.hbase.security.UserProvider;<a name="line.190"></a>
-<span class="sourceLineNo">191</span>import org.apache.hadoop.hbase.trace.TraceUtil;<a name="line.191"></a>
-<span class="sourceLineNo">192</span>import org.apache.hadoop.hbase.util.Addressing;<a name="line.192"></a>
-<span class="sourceLineNo">193</span>import org.apache.hadoop.hbase.util.BloomFilterUtil;<a name="line.193"></a>
-<span class="sourceLineNo">194</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.194"></a>
-<span class="sourceLineNo">195</span>import org.apache.hadoop.hbase.util.CompressionTest;<a name="line.195"></a>
-<span class="sourceLineNo">196</span>import org.apache.hadoop.hbase.util.EncryptionTest;<a name="line.196"></a>
-<span class="sourceLineNo">197</span>import org.apache.hadoop.hbase.util.HBaseFsck;<a name="line.197"></a>
-<span class="sourceLineNo">198</span>import org.apache.hadoop.hbase.util.HFileArchiveUtil;<a name="line.198"></a>
-<span class="sourceLineNo">199</span>import org.apache.hadoop.hbase.util.HasThread;<a name="line.199"></a>
-<span class="sourceLineNo">200</span>import org.apache.hadoop.hbase.util.IdLock;<a name="line.200"></a>
-<span class="sourceLineNo">201</span>import org.apache.hadoop.hbase.util.ModifyRegionUtils;<a name="line.201"></a>
-<span class="sourceLineNo">202</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>import org.apache.hadoop.hbase.util.RetryCounter;<a name="line.203"></a>
-<span class="sourceLineNo">204</span>import org.apache.hadoop.hbase.util.RetryCounterFactory;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>import org.apache.hadoop.hbase.util.VersionInfo;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>import org.apache.hadoop.hbase.zookeeper.LoadBalancerTracker;<a name="line.207"></a>
-<span class="sourceLineNo">208</span>import org.apache.hadoop.hbase.zookeeper.MasterAddressTracker;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>import org.apache.hadoop.hbase.zookeeper.MasterMaintenanceModeTracker;<a name="line.209"></a>
-<span class="sourceLineNo">210</span>import org.apache.hadoop.hbase.zookeeper.RegionNormalizerTracker;<a name="line.210"></a>
-<span class="sourceLineNo">211</span>import org.apache.hadoop.hbase.zookeeper.ZKClusterId;<a name="line.211"></a>
-<span class="sourceLineNo">212</span>import org.apache.hadoop.hbase.zookeeper.ZKUtil;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>import org.apache.hadoop.hbase.zookeeper.ZKWatcher;<a name="line.213"></a>
-<span class="sourceLineNo">214</span>import org.apache.hadoop.hbase.zookeeper.ZNodePaths;<a name="line.214"></a>
-<span class="sourceLineNo">215</span>import org.apache.yetus.audience.InterfaceAudience;<a name="line.215"></a>
-<span class="sourceLineNo">216</span>import org.apache.zookeeper.KeeperException;<a name="line.216"></a>
-<span class="sourceLineNo">217</span>import org.eclipse.jetty.server.Server;<a name="line.217"></a>
-<span class="sourceLineNo">218</span>import org.eclipse.jetty.server.ServerConnector;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>import org.eclipse.jetty.servlet.ServletHolder;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>import org.eclipse.jetty.webapp.WebAppContext;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>import org.slf4j.Logger;<a name="line.221"></a>
-<span class="sourceLineNo">222</span>import org.slf4j.LoggerFactory;<a name="line.222"></a>
-<span class="sourceLineNo">223</span><a name="line.223"></a>
-<span class="sourceLineNo">224</span>import org.apache.hbase.thirdparty.com.google.common.annotations.VisibleForTesting;<a name="line.224"></a>
-<span class="sourceLineNo">225</span>import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableSet;<a name="line.225"></a>
-<span class="sourceLineNo">226</span>import org.apache.hbase.thirdparty.com.google.common.collect.Lists;<a name="line.226"></a>
-<span class="sourceLineNo">227</span>import org.apache.hbase.thirdparty.com.google.common.collect.Maps;<a name="line.227"></a>
-<span class="sourceLineNo">228</span><a name="line.228"></a>
-<span class="sourceLineNo">229</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.229"></a>
-<span class="sourceLineNo">230</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.GetRegionInfoResponse.CompactionState;<a name="line.230"></a>
-<span class="sourceLineNo">231</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas;<a name="line.231"></a>
-<span class="sourceLineNo">232</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.SpaceViolationPolicy;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotProtos.SnapshotDescription;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos;<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>/**<a name="line.236"></a>
-<span class="sourceLineNo">237</span> * HMaster is the "master server" for HBase. An HBase cluster has one active<a name="line.237"></a>
-<span class="sourceLineNo">238</span> * master.  If many masters are started, all compete.  Whichever wins goes on to<a name="line.238"></a>
-<span class="sourceLineNo">239</span> * run the cluster.  All others park themselves in their constructor until<a name="line.239"></a>
-<span class="sourceLineNo">240</span> * master or cluster shutdown or until the active master loses its lease in<a name="line.240"></a>
-<span class="sourceLineNo">241</span> * zookeeper.  Thereafter, all running master jostle to take over master role.<a name="line.241"></a>
-<span class="sourceLineNo">242</span> *<a name="line.242"></a>
-<span class="sourceLineNo">243</span> * &lt;p&gt;The Master can be asked shutdown the cluster. See {@link #shutdown()}.  In<a name="line.243"></a>
-<span class="sourceLineNo">244</span> * this case it will tell all regionservers to go down and then wait on them<a name="line.244"></a>
-<span class="sourceLineNo">245</span> * all reporting in that they are down.  This master will then shut itself down.<a name="line.245"></a>
-<span class="sourceLineNo">246</span> *<a name="line.246"></a>
-<span class="sourceLineNo">247</span> * &lt;p&gt;You can also shutdown just this master.  Call {@link #stopMaster()}.<a name="line.247"></a>
-<span class="sourceLineNo">248</span> *<a name="line.248"></a>
-<span class="sourceLineNo">249</span> * @see org.apache.zookeeper.Watcher<a name="line.249"></a>
-<span class="sourceLineNo">250</span> */<a name="line.250"></a>
-<span class="sourceLineNo">251</span>@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)<a name="line.251"></a>
-<span class="sourceLineNo">252</span>@SuppressWarnings("deprecation")<a name="line.252"></a>
-<span class="sourceLineNo">253</span>public class HMaster extends HRegionServer implements MasterServices {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>  private static Logger LOG = LoggerFactory.getLogger(HMaster.class);<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>   * Protection against zombie master. Started once Master accepts active responsibility and<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * starts taking over responsibilities. Allows a finite time window before giving up ownership.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   */<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  private static class InitializationMonitor extends HasThread {<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    /** The amount of time in milliseconds to sleep before checking initialization status. */<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    public static final String TIMEOUT_KEY = "hbase.master.initializationmonitor.timeout";<a name="line.262"></a>
-<span class="sourceLineNo">263</span>    public static final long TIMEOUT_DEFAULT = TimeUnit.MILLISECONDS.convert(15, TimeUnit.MINUTES);<a name="line.263"></a>
-<span class="sourceLineNo">264</span><a name="line.264"></a>
-<span class="sourceLineNo">265</span>    /**<a name="line.265"></a>
-<span class="sourceLineNo">266</span>     * When timeout expired and initialization has not complete, call {@link System#exit(int)} when<a name="line.266"></a>
-<span class="sourceLineNo">267</span>     * true, do nothing otherwise.<a name="line.267"></a>
-<span class="sourceLineNo">268</span>     */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public static final String HALT_KEY = "hbase.master.initializationmonitor.haltontimeout";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    public static final boolean HALT_DEFAULT = false;<a name="line.270"></a>
-<span class="sourceLineNo">271</span><a name="line.271"></a>
-<span class="sourceLineNo">272</span>    private final HMaster master;<a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private final long timeout;<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    private final boolean haltOnTimeout;<a name="line.274"></a>
-<span class="sourceLineNo">275</span><a name="line.275"></a>
-<span class="sourceLineNo">276</span>    /** Creates a Thread that monitors the {@link #isInitialized()} state. */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    InitializationMonitor(HMaster master) {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>      super("MasterInitializationMonitor");<a name="line.278"></a>
-<span class="sourceLineNo">279</span>      this.master = master;<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      this.timeout = master.getConfiguration().getLong(TIMEOUT_KEY, TIMEOUT_DEFAULT);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      this.haltOnTimeout = master.getConfiguration().getBoolean(HALT_KEY, HALT_DEFAULT);<a name="line.281"></a>
-<span class="sourceLineNo">282</span>      this.setDaemon(true);<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>    @Override<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    public void run() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      try {<a name="line.287"></a>
-<span class="sourceLineNo">288</span>        while (!master.isStopped() &amp;&amp; master.isActiveMaster()) {<a name="line.288"></a>
-<span class="sourceLineNo">289</span>          Thread.sleep(timeout);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>          if (master.isInitialized()) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>            LOG.debug("Initialization completed within allotted tolerance. Monitor exiting.");<a name="line.291"></a>
-<span class="sourceLineNo">292</span>          } else {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>            LOG.error("Master failed to complete initialization after " + timeout + "ms. Please"<a name="line.293"></a>
-<span class="sourceLineNo">294</span>                + " consider submitting a bug report including a thread dump of this process.");<a name="line.294"></a>
-<span class="sourceLineNo">295</span>            if (haltOnTimeout) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>              LOG.error("Zombie Master exiting. Thread dump to stdout");<a name="line.296"></a>
-<span class="sourceLineNo">297</span>              Threads.printThreadInfo(System.out, "Zombie HMaster");<a name="line.297"></a>
-<span class="sourceLineNo">298</span>              System.exit(-1);<a name="line.298"></a>
-<span class="sourceLineNo">299</span>            }<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          }<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>      } catch (InterruptedException ie) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        LOG.trace("InitMonitor thread interrupted. Existing.");<a name="line.303"></a>
-<span class="sourceLineNo">304</span>      }<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    }<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  }<a name="line.306"></a>
-<span class="sourceLineNo">307</span><a name="line.307"></a>
-<span class="sourceLineNo">308</span>  // MASTER is name of the webapp and the attribute name used stuffing this<a name="line.308"></a>
-<span class="sourceLineNo">309</span>  //instance into web context.<a name="line.309"></a>
-<span class="sourceLineNo">310</span>  public static final String MASTER = "master";<a name="line.310"></a>
-<span class="sourceLineNo">311</span><a name="line.311"></a>
-<span class="sourceLineNo">312</span>  // Manager and zk listener for master election<a name="line.312"></a>
-<span class="sourceLineNo">313</span>  private final ActiveMasterManager activeMasterManager;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  // Region server tracker<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  private RegionServerTracker regionServerTracker;<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  // Draining region server tracker<a name="line.316"></a>
-<span class="sourceLineNo">317</span>  private DrainingServerTracker drainingServerTracker;<a name="line.317"></a>
-<span class="sourceLineNo">318</span>  // Tracker for load balancer state<a name="line.318"></a>
-<span class="sourceLineNo">319</span>  LoadBalancerTracker loadBalancerTracker;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>  // Tracker for meta location, if any client ZK quorum specified<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  MetaLocationSyncer metaLocationSyncer;<a name="line.321"></a>
-<span class="sourceLineNo">322</span>  // Tracker for active master location, if any client ZK quorum specified<a name="line.322"></a>
-<span class="sourceLineNo">323</span>  MasterAddressSyncer masterAddressSyncer;<a name="line.323"></a>
-<span class="sourceLineNo">324</span><a name="line.324"></a>
-<span class="sourceLineNo">325</span>  // Tracker for split and merge state<a name="line.325"></a>
-<span class="sourceLineNo">326</span>  private SplitOrMergeTracker splitOrMergeTracker;<a name="line.326"></a>
-<span class="sourceLineNo">327</span><a name="line.327"></a>
-<span class="sourceLineNo">328</span>  // Tracker for region normalizer state<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  private RegionNormalizerTracker regionNormalizerTracker;<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  //Tracker for master maintenance mode setting<a name="line.331"></a>
-<span class="sourceLineNo">332</span>  private MasterMaintenanceModeTracker maintenanceModeTracker;<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>  private ClusterSchemaService clusterSchemaService;<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>  public static final String HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS =<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    "hbase.master.wait.on.service.seconds";<a name="line.337"></a>
-<span class="sourceLineNo">338</span>  public static final int DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS = 5 * 60;<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>  // Metrics for the HMaster<a name="line.340"></a>
-<span class="sourceLineNo">341</span>  final MetricsMaster metricsMaster;<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  // file system manager for the master FS operations<a name="line.342"></a>
-<span class="sourceLineNo">343</span>  private MasterFileSystem fileSystemManager;<a name="line.343"></a>
-<span class="sourceLineNo">344</span>  private MasterWalManager walManager;<a name="line.344"></a>
-<span class="sourceLineNo">345</span><a name="line.345"></a>
-<span class="sourceLineNo">346</span>  // server manager to deal with region server info<a name="line.346"></a>
-<span class="sourceLineNo">347</span>  private volatile ServerManager serverManager;<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>  // manager of assignment nodes in zookeeper<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  private AssignmentManager assignmentManager;<a name="line.350"></a>
-<span class="sourceLineNo">351</span><a name="line.351"></a>
-<span class="sourceLineNo">352</span>  // manager of replication<a name="line.352"></a>
-<span class="sourceLineNo">353</span>  private ReplicationPeerManager replicationPeerManager;<a name="line.353"></a>
-<span class="sourceLineNo">354</span><a name="line.354"></a>
-<span class="sourceLineNo">355</span>  private SyncReplicationReplayWALManager syncReplicationReplayWALManager;<a name="line.355"></a>
-<span class="sourceLineNo">356</span><a name="line.356"></a>
-<span class="sourceLineNo">357</span>  // buffer for "fatal error" notices from region servers<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  // in the cluster. This is only used for assisting<a name="line.358"></a>
-<span class="sourceLineNo">359</span>  // operations/debugging.<a name="line.359"></a>
-<span class="sourceLineNo">360</span>  MemoryBoundedLogMessageBuffer rsFatals;<a name="line.360"></a>
-<span class="sourceLineNo">361</span><a name="line.361"></a>
-<span class="sourceLineNo">362</span>  // flag set after we become the active master (used for testing)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  private volatile boolean activeMaster = false;<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>  // flag set after we complete initialization once active<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  private final ProcedureEvent&lt;?&gt; initialized = new ProcedureEvent&lt;&gt;("master initialized");<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>  // flag set after master services are started,<a name="line.368"></a>
-<span class="sourceLineNo">369</span>  // initialization may have not completed yet.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>  volatile boolean serviceStarted = false;<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>  // Maximum time we should run balancer for<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  private final int maxBlancingTime;<a name="line.373"></a>
-<span class="sourceLineNo">374</span>  // Maximum percent of regions in transition when balancing<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  private final double maxRitPercent;<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  private final LockManager lockManager = new LockManager(this);<a name="line.377"></a>
-<span class="sourceLineNo">378</span><a name="line.378"></a>
-<span class="sourceLineNo">379</span>  private LoadBalancer balancer;<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  private RegionNormalizer normalizer;<a name="line.380"></a>
-<span class="sourceLineNo">381</span>  private BalancerChore balancerChore;<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  private RegionNormalizerChore normalizerChore;<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  private ClusterStatusChore clusterStatusChore;<a name="line.383"></a>
-<span class="sourceLineNo">384</span>  private ClusterStatusPublisher clusterStatusPublisherChore = null;<a name="line.384"></a>
-<span class="sourceLineNo">385</span><a name="line.385"></a>
-<span class="sourceLineNo">386</span>  CatalogJanitor catalogJanitorChore;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  private LogCleaner logCleaner;<a name="line.387"></a>
-<span class="sourceLineNo">388</span>  private HFileCleaner hfileCleaner;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  private ReplicationBarrierCleaner replicationBarrierCleaner;<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  private ExpiredMobFileCleanerChore expiredMobFileCleanerChore;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>  private MobCompactionChore mobCompactChore;<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  private MasterMobCompactionThread mobCompactThread;<a name="line.392"></a>
-<span class="sourceLineNo">393</span>  // used to synchronize the mobCompactionStates<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  private final IdLock mobCompactionLock = new IdLock();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  // save the information of mob compactions in tables.<a name="line.395"></a>
-<span class="sourceLineNo">396</span>  // the key is table name, the value is the number of compactions in that table.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>  private Map&lt;TableName, AtomicInteger&gt; mobCompactionStates = Maps.newConcurrentMap();<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>  MasterCoprocessorHost cpHost;<a name="line.399"></a>
-<span class="sourceLineNo">400</span><a name="line.400"></a>
-<span class="sourceLineNo">401</span>  private final boolean preLoadTableDescriptors;<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>  // Time stamps for when a hmaster became active<a name="line.403"></a>
-<span class="sourceLineNo">404</span>  private long masterActiveTime;<a name="line.404"></a>
-<span class="sourceLineNo">405</span><a name="line.405"></a>
-<span class="sourceLineNo">406</span>  // Time stamp for when HMaster finishes becoming Active Master<a name="line.406"></a>
-<span class="sourceLineNo">407</span>  private long masterFinishedInitializationTime;<a name="line.407"></a>
-<span class="sourceLineNo">408</span><a name="line.408"></a>
-<span class="sourceLineNo">409</span>  //should we check the compression codec type at master side, default true, HBASE-6370<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  private final boolean masterCheckCompression;<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  //should we check encryption settings at master side, default true<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  private final boolean masterCheckEncryption;<a name="line.413"></a>
-<span class="sourceLineNo">414</span><a name="line.414"></a>
-<span class="sourceLineNo">415</span>  Map&lt;String, Service&gt; coprocessorServiceHandlers = Maps.newHashMap();<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>  // monitor for snapshot of hbase tables<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  SnapshotManager snapshotManager;<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  // monitor for distributed procedures<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  private MasterProcedureManagerHost mpmHost;<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  // it is assigned after 'initialized' guard set to true, so should be volatile<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  private volatile MasterQuotaManager quotaManager;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  private SpaceQuotaSnapshotNotifier spaceQuotaSnapshotNotifier;<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  private QuotaObserverChore quotaObserverChore;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>  private SnapshotQuotaObserverChore snapshotQuotaChore;<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>  private ProcedureExecutor&lt;MasterProcedureEnv&gt; procedureExecutor;<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  private WALProcedureStore procedureStore;<a name="line.429"></a>
-<span class="sourceLineNo">430</span><a name="line.430"></a>
-<span class="sourceLineNo">431</span>  // handle table states<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  private TableStateManager tableStateManager;<a name="line.432"></a>
-<span class="sourceLineNo">433</span><a name="line.433"></a>
-<span class="sourceLineNo">434</span>  private long splitPlanCount;<a name="line.434"></a>
-<span class="sourceLineNo">435</span>  private long mergePlanCount;<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>  /* Handle favored nodes information */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  private FavoredNodesManager favoredNodesManager;<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /** jetty server for master to redirect requests to regionserver infoServer */<a name="line.440"></a>
-<span class="sourceLineNo">441</span>  private Server masterJettyServer;<a name="line.441"></a>
-<span class="sourceLineNo">442</span><a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public static class RedirectServlet extends HttpServlet {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    private static final long serialVersionUID = 2894774810058302473L;<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    private final int regionServerInfoPort;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    private final String regionServerHostname;<a name="line.446"></a>
-<span class="sourceLineNo">447</span><a name="line.447"></a>
-<span class="sourceLineNo">448</span>    /**<a name="line.448"></a>
-<span class="sourceLineNo">449</span>     * @param infoServer that we're trying to send all requests to<a name="line.449"></a>
-<span class="sourceLineNo">450</span>     * @param hostname may be null. if given, will be used for redirects instead of host from client.<a name="line.450"></a>
-<span class="sourceLineNo">451</span>     */<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    public RedirectServlet(InfoServer infoServer, String hostname) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>       regionServerInfoPort = infoServer.getPort();<a name="line.453"></a>
-<span class="sourceLineNo">454</span>       regionServerHostname = hostname;<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    }<a name="line.455"></a>
-<span class="sourceLineNo">456</span><a name="line.456"></a>
-<span class="sourceLineNo">457</span>    @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    public void doGet(HttpServletRequest request,<a name="line.458"></a>
-<span class="sourceLineNo">459</span>        HttpServletResponse response) throws ServletException, IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      String redirectHost = regionServerHostname;<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      if(redirectHost == null) {<a name="line.461"></a>
-<span class="sourceLineNo">462</span>        redirectHost = request.getServerName();<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        if(!Addressing.isLocalAddress(InetAddress.getByName(redirectHost))) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>          LOG.warn("Couldn't resolve '" + redirectHost + "' as an address local to this node and '" +<a name="line.464"></a>
-<span class="sourceLineNo">465</span>              MASTER_HOSTNAME_KEY + "' is not set; client will get a HTTP 400 response. If " +<a name="line.465"></a>
-<span class="sourceLineNo">466</span>              "your HBase deployment relies on client accessible names that the region server process " +<a name="line.466"></a>
-<span class="sourceLineNo">467</span>              "can't resolve locally, then you should set the previously mentioned configuration variable " +<a name="line.467"></a>
-<span class="sourceLineNo">468</span>              "to an appropriate hostname.");<a name="line.468"></a>
-<span class="sourceLineNo">469</span>          // no sending client provided input back to the client, so the goal host is just in the logs.<a name="line.469"></a>
-<span class="sourceLineNo">470</span>          response.sendError(400, "Request was to a host that I can't resolve for any of the network interfaces on " +<a name="line.470"></a>
-<span class="sourceLineNo">471</span>              "this node. If this is due to an intermediary such as an HTTP load balancer or other proxy, your HBase " +<a name="line.471"></a>
-<span class="sourceLineNo">472</span>              "administrator can set '" + MASTER_HOSTNAME_KEY + "' to point to the correct hostname.");<a name="line.472"></a>
-<span class="sourceLineNo">473</span>          return;<a name="line.473"></a>
-<span class="sourceLineNo">474</span>        }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      }<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      // TODO this scheme should come from looking at the scheme registered in the infoserver's http server for the<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      // host and port we're using, but it's buried way too deep to do that ATM.<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      String redirectUrl = request.getScheme() + "://"<a name="line.478"></a>
-<span class="sourceLineNo">479</span>        + redirectHost + ":" + regionServerInfoPort<a name="line.479"></a>
-<span class="sourceLineNo">480</span>        + request.getRequestURI();<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      response.sendRedirect(redirectUrl);<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  }<a name="line.483"></a>
-<span class="sourceLineNo">484</span><a name="line.484"></a>
-<span class="sourceLineNo">485</span>  /**<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   * Initializes the HMaster. The steps are as follows:<a name="line.486"></a>
-<span class="sourceLineNo">487</span>   * &lt;p&gt;<a name="line.487"></a>
-<span class="sourceLineNo">488</span>   * &lt;ol&gt;<a name="line.488"></a>
-<span class="sourceLineNo">489</span>   * &lt;li&gt;Initialize the local HRegionServer<a name="line.489"></a>
-<span class="sourceLineNo">490</span>   * &lt;li&gt;Start the ActiveMasterManager.<a name="line.490"></a>
-<span class="sourceLineNo">491</span>   * &lt;/ol&gt;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>   * &lt;p&gt;<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * Remaining steps of initialization occur in<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * #finishActiveMasterInitialization(MonitoredTask) after<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * the master becomes the active one.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public HMaster(final Configuration conf)<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      throws IOException, KeeperException {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    super(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>    TraceUtil.initTracer(conf);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>    try {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      this.rsFatals = new MemoryBoundedLogMessageBuffer(<a name="line.502"></a>
-<span class="sourceLineNo">503</span>          conf.getLong("hbase.master.buffer.for.rs.fatals", 1 * 1024 * 1024));<a name="line.503"></a>
-<span class="sourceLineNo">504</span>      LOG.info("hbase.rootdir=" + getRootDir() +<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          ", hbase.cluster.distributed=" + this.conf.getBoolean(HConstants.CLUSTER_DISTRIBUTED, false));<a name="line.505"></a>
-<span class="sourceLineNo">506</span><a name="line.506"></a>
-<span class="sourceLineNo">507</span>      // Disable usage of meta replicas in the master<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      this.conf.setBoolean(HConstants.USE_META_REPLICAS, false);<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>      decorateMasterConfiguration(this.conf);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>      // Hack! Maps DFSClient =&gt; Master for logs.  HDFS made this<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      // config param for task trackers, but we can piggyback off of it.<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      if (this.conf.get("mapreduce.task.attempt.id") == null) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>        this.conf.set("mapreduce.task.attempt.id", "hb_m_" + this.serverName.toString());<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      }<a name="line.516"></a>
-<span class="sourceLineNo">517</span><a name="line.517"></a>
-<span class="sourceLineNo">518</span>      // should we check the compression codec type at master side, default true, HBASE-6370<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      this.masterCheckCompression = conf.getBoolean("hbase.master.check.compression", true);<a name="line.519"></a>
-<span class="sourceLineNo">520</span><a name="line.520"></a>
-<span class="sourceLineNo">521</span>      // should we check encryption settings at master side, default true<a name="line.521"></a>
-<span class="sourceLineNo">522</span>      this.masterCheckEncryption = conf.getBoolean("hbase.master.check.encryption", true);<a name="line.522"></a>
-<span class="sourceLineNo">523</span><a name="line.523"></a>
-<span class="sourceLineNo">524</span>      this.metricsMaster = new MetricsMaster(new MetricsMasterWrapperImpl(this));<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>      // preload table descriptor at startup<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      this.preLoadTableDescriptors = conf.getBoolean("hbase.master.preload.tabledescriptors", true);<a name="line.527"></a>
-<span class="sourceLineNo">528</span><a name="line.528"></a>
-<span class="sourceLineNo">529</span>      this.maxBlancingTime = getMaxBalancingTime();<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.maxRitPercent = conf.getDouble(HConstants.HBASE_MASTER_BALANCER_MAX_RIT_PERCENT,<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          HConstants.DEFAULT_HBASE_MASTER_BALANCER_MAX_RIT_PERCENT);<a name="line.531"></a>
-<span class="sourceLineNo">532</span><a name="line.532"></a>
-<span class="sourceLineNo">533</span>      // Do we publish the status?<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>      boolean shouldPublish = conf.getBoolean(HConstants.STATUS_PUBLISHED,<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          HConstants.STATUS_PUBLISHED_DEFAULT);<a name="line.536"></a>
-<span class="sourceLineNo">537</span>      Class&lt;? extends ClusterStatusPublisher.Publisher&gt; publisherClass =<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          conf.getClass(ClusterStatusPublisher.STATUS_PUBLISHER_CLASS,<a name="line.538"></a>
-<span class="sourceLineNo">539</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS,<a name="line.539"></a>
-<span class="sourceLineNo">540</span>              ClusterStatusPublisher.Publisher.class);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>      if (shouldPublish) {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        if (publisherClass == null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>          LOG.warn(HConstants.STATUS_PUBLISHED + " is true, but " +<a name="line.544"></a>
-<span class="sourceLineNo">545</span>              ClusterStatusPublisher.DEFAULT_STATUS_PUBLISHER_CLASS +<a name="line.545"></a>
-<span class="sourceLineNo">546</span>              " is not set - not publishing status");<a name="line.546"></a>
-<span class="sourceLineNo">547</span>        } else {<a name="line.547"></a>
-<span class="sourceLineNo">548</span>          clusterStatusPublisherChore = new ClusterStatusPublisher(this, conf, publisherClass);<a name="line.548"></a>
-<span class="sourceLineNo">549</span>          getChoreService().scheduleChore(clusterStatusPublisherChore);<a name="line.549"></a>
-<span class="sourceLineNo">550</span>        }<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>      // Some unit tests don't need a cluster, so no zookeeper at all<a name="line.553"></a>
-<span class="sourceLineNo">554</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>        this.activeMasterManager = new ActiveMasterManager(zooKeeper, this.serverName, this);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>      } else {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>        this.activeMasterManager = null;<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    } catch (Throwable t) {<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      // Make sure we log the exception. HMaster is often started via reflection and the<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      // cause of failed startup is lost.<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      LOG.error("Failed construction of Master", t);<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      throw t;<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    }<a name="line.564"></a>
-<span class="sourceLineNo">565</span>  }<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>  @Override<a name="line.567"></a>
-<span class="sourceLineNo">568</span>  protected String getUseThisHostnameInstead(Configuration conf) {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    return conf.get(MASTER_HOSTNAME_KEY);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>  // Main run loop. Calls through to the regionserver run loop AFTER becoming active Master; will<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  // block in here until then.<a name="line.573"></a>
-<span class="sourceLineNo">574</span>  @Override<a name="line.574"></a>
-<span class="sourceLineNo">575</span>  public void run() {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (!conf.getBoolean("hbase.testing.nocluster", false)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        Threads.setDaemonThreadRunning(new Thread(() -&gt; {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          try {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            int infoPort = putUpJettyServer();<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            startActiveMasterManager(infoPort);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          } catch (Throwable t) {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            // Make sure we log the exception.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            String error = "Failed to become Active Master";<a name="line.584"></a>
-<span class="sourceLineNo">585</span>            LOG.error(error, t);<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            // Abort should have been called already.<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            if (!isAborted()) {<a name="line.587"></a>
-<span class="sourceLineNo">588</span>              abort(error, t);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>            }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        }), getName() + ":becomeActiveMaster");<a name="line.591"></a>
-<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      // Fall in here even if we have been aborted. Need to run the shutdown services and<a name="line.593"></a>
-<span class="sourceLineNo">594</span>      // the super run call will do this for us.<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      super.run();<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    } finally {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      if (this.clusterSchemaService != null) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>        // If on way out, then we are no longer active master.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        this.clusterSchemaService.stopAsync();<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          this.clusterSchemaService.awaitTerminated(<a name="line.601"></a>
-<span class="sourceLineNo">602</span>              getConfiguration().getInt(HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS,<a name="line.602"></a>
-<span class="sourceLineNo">603</span>              DEFAULT_HBASE_MASTER_WAIT_ON_SERVICE_IN_SECONDS), TimeUnit.SECONDS);<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (TimeoutException te) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Failed shutdown of clusterSchemaService", te);<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        }<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>      this.activeMaster = false;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>  }<a name="line.610"></a>
-<span class="sourceLineNo">611</span><a name="line.611"></a>
-<span class="sourceLineNo">612</span>  // return the actual infoPort, -1 means disable info server.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  private int putUpJettyServer() throws IOException {<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    if (!conf.getBoolean("hbase.master.infoserver.redirect", true)) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return -1;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    final int infoPort = conf.getInt("hbase.master.info.port.orig",<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      HConstants.DEFAULT_MASTER_INFOPORT);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    // -1 is for disabling info server, so no redirecting<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if (infoPort &lt; 0 || infoServer == null) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return -1;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    if(infoPort == infoServer.getPort()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      return infoPort;<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    }<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    final String addr = conf.get("hbase.master.info.bindAddress", "0.0.0.0");<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    if (!Addressing.isLocalAddress(InetAddress.getByName(addr))) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      String msg =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>          "Failed to start redirecting jetty server. Address " + addr<a name="line.629"></a>
-<span class="sourceLineNo">630</span>              + " does not belong to this host. Correct configuration parameter: "<a name="line.630"></a>
-<span class="sourceLineNo">631</span>              + "hbase.master.info.bindAddress";<a name="line.631"></a>
-<span class="sourceLineNo">632</span>      LOG.error(msg);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>      throw new IOException(msg);<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    }<a name="line.634"></a>
-<span class="sourceLineNo">635</span><a name="line.635"></a>
-<span class="sourceLineNo">636</span>    // TODO I'm pretty sure we could just add another binding to the InfoServer run by<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    // the RegionServer and have it run the RedirectServlet instead of standing up<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // a second entire stack here.<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    masterJettyServer = new Server();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    final ServerConnector connector = new ServerConnector(masterJettyServer);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    connector.setHost(addr);<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    connector.setPort(infoPort);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    masterJettyServer.addConnector(connector);<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    masterJettyServer.setStopAtShutdown(true);<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>    final String redirectHostname =<a name="line.646"></a>
-<span class="sourceLineNo">647</span>        StringUtils.isBlank(useThisHostnameInstead) ? null : useThisHostnameInstead;<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    final RedirectServlet redirect = new RedirectServlet(infoServer, redirectHostname);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    final WebAppContext context = new WebAppContext(null, "/", null, null, null, null, WebAppContext.NO_SESSIONS);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    context.addServlet(new ServletHolder(redirect), "/*");<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    context.setServer(masterJettyServer);<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>    try {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      masterJettyServer.start();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    } catch (Exception e) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      throw new IOException("Failed to start redirecting jetty server", e);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return connector.getLocalPort();<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  @Override<a name="line.662"></a>
-<span class="sourceLineNo">663</span>  protected Function&lt;TableDescriptorBuilder, TableDescriptorBuilder&gt; getMetaTableObserver() {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    return builder -&gt; builder.setRegionReplication(conf.getInt(HConstants.META_REPLICAS_NUM, HConstants.DEFAULT_META_REPLICA_NUM));<a name="line.664"></a>
-<span class="sourceLineNo">665</span>  }<a name="line.665"></a>
-<span class="sourceLineNo">666</span>  /**<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * For compatibility, if failed with regionserver credentials, try the master one<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
-<span class="sourceLineNo">669</span>  @Override<a name="line.669"></a>
-<span class="sourceLineNo">670</span>  protected void login(UserProvider user, String host) throws IOException {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    try {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      super.login(user, host);<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    } catch (IOException ie) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>      user.login("hbase.master.keytab.file",<a name="line.674"></a>
-<span class="sourceLineNo">675</span>        "hbase.master.kerberos.principal", host);<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    }<a name="line.676"></a>
-<span class="sourceLineNo">677</span>  }<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>  /**<a name="line.679"></a>
-<span class="sourceLineNo">680</span>   * If configured to put regions on active master,<a name="line.680"></a>
-<span class="sourceLineNo">681</span>   * wait till a backup master becomes active.<a name="line.681"></a>
-<span class="sourceLineNo">682</span>   * Otherwise, loop till the server is stopped or aborted.<a name="line.682"></a>
-<span class="sourceLineNo">683</span>   */<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Override<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  protected void waitForMasterActive(){<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    boolean tablesOnMaster = LoadBalancer.isTablesOnMaster(conf);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    while (!(tablesOnMaster &amp;&amp; activeMaster) &amp;&amp; !isStopped() &amp;&amp; !isAborted()) {<a name="line.687"></a>
-<span class="sourceLineNo">688</span>      sleeper.sleep();<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    }<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
-<span class="sourceLineNo">691</span><a name="line.691"></a>
-<span class="sourceLineNo">692</span>  @VisibleForTesting<a name="line.692"></a>
-<span class="sourceLineNo">693</span>  public MasterRpcServices getMasterRpcServices() {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    return (MasterRpcServices)rpcServices;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>  }<a name="line.695"></a>
-<span class="sourceLineNo">696</span><a name="line.696"></a>
-<span class="sourceLineNo">697</span>  public boolean balanceSwitch(final boolean b) throws IOException {<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    return getMasterRpcServices().switchBalancer(b, BalanceSwitchMode.ASYNC);<a name="line.698"></a>
-<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>  @Override<a name="line.701"></a>
-<span class="sourceLineNo">702</span>  protected String getProcessName() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return MASTER;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  @Override<a name="line.706"></a>
-<span class="sourceLineNo">707</span>  protected boolean canCreateBaseZNode() {<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    return true;<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>  @Override<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  protected boolean canUpdateTableDescriptor() {<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    return true;<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  @Override<a name="line.716"></a>
-<span class="sourceLineNo">717</span>  protected RSRpcServices createRpcServices() throws IOException {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    return new MasterRpcServices(this);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
-<span class="sourceLineNo">720</span><a name="line.720"></a>
-<span class="sourceLineNo">721</span>  @Override<a name="line.721"></a>
-<span class="sourceLineNo">722</span>  protected void configureInfoServer() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    infoServer.addServlet("master-status", "/master-status", MasterStatusServlet.class);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    infoServer.setAttribute(MASTER, this);<a name="line.724"></a>
-<span class="sourceLineNo">725</span>    if (LoadBalancer.isTablesOnMaster(conf)) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>      super.configureInfoServer();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  @Override<a name="line.730"></a>
-<span class="sourceLineNo">731</span>  protected Class&lt;? extends HttpServlet&gt; getDumpServlet() {<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    return MasterDumpServlet.class;<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Override<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public MetricsMaster getMasterMetrics() {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    return metricsMaster;<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  /**<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   * &lt;p&gt;<a name="line.741"></a>
-<span class="sourceLineNo">742</span>   * Initialize all ZK based system trackers. But do not include {@link RegionServerTracker}, it<a name="line.742"></a>
-<span class="sourceLineNo">743</span>   * should have already been initialized along with {@link ServerManager}.<a name="line.743"></a>
-<span class="sourceLineNo">744</span>   * &lt;/p&gt;<a name="line.744"></a>
-<span class="sourceLineNo">745</span>   * &lt;p&gt;<a name="line.745"></a>
-<span class="sourceLineNo">746</span>   * Will be overridden in tests.<a name="line.746"></a>
-<span class="sourceLineNo">747</span>   * &lt;/p&gt;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>   */<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  @VisibleForTesting<a name="line.749"></a>
-<span class="sourceLineNo">750</span>  protected void initializeZKBasedSystemTrackers()<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      throws IOException, InterruptedException, KeeperException, ReplicationException {<a name="line.751"></a>
-<span class="sourceLineNo">752</span>    this.balancer = LoadBalancerFactory.getLoadBalancer(conf);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    this.normalizer = RegionNormalizerFactory.getRegionNormalizer(conf);<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    this.normalizer.setMasterServices(this);<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    this.normalizer.setMasterRpcServices((MasterRpcServices)rpcServices);<a name="line.755"></a>
-<span class="sourceLineNo">756</span>    this.loadBalancerTracker = new LoadBalancerTracker(zooKeeper, this);<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    this.loadBalancerTracker.start();<a name="line.757"></a>
-<span class="sourceLineNo">758</span><a name="line.758"></a>
-<span class="sourceLineNo">759</span>    this.regionNormalizerTracker = new RegionNormalizerTracker(zooKeeper, this);<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    this.regionNormalizerTracker.start();<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>    this.splitOrMergeTracker = new SplitOrMergeTracker(zooKeeper, conf, this);<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    this.splitOrMergeTracker.start();<a name="line.763"></a>
-<span class="sourceLineNo">764</span><a name="line.764"></a>
-<span class="sourceLineNo">765</span>    this.replicationPeerManager = ReplicationPeerManager.create(zooKeeper, conf);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    this.syncReplicationReplayWALManager = new SyncReplicationReplayWALManager(this);<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    this.drainingServerTracker = new DrainingServerTracker(zooKeeper, this, this.serverManager);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    this.drainingServerTracker.start();<a name="line.769"></a>
-<span class="sourceLineNo">770</span><a name="line.770"></a>
-<span class="sourceLineNo">771</span>    this.maintenanceModeTracker = new MasterMaintenanceModeTracker(zooKeeper);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    this.maintenanceModeTracker.start();<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>    String clientQuorumServers = conf.get(HConstants.CLIENT_ZOOKEEPER_QUORUM);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>    boolean clientZkObserverMode = conf.getBoolean(HConstants.CLIENT_ZOOKEEPER_OBSERVER_MODE,<a name="line.775"></a>
-<span class="sourceLineNo">776</span>      HConstants.DEFAULT_CLIENT_ZOOKEEPER_OBSERVER_MODE);<a name="line.776"></a>
-<span class="sourceLineNo">777</span>    if (clientQuorumServers != null &amp;&amp; !clientZkObserverMode) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>      // we need to take care of the ZK information synchronization<a name="line.778"></a>
-<span class="sourceLineNo">779</span>      // if given client ZK are not observer nodes<a name="line.779"></a>
-<span class="sourceLineNo">780</span>      ZKWatcher clientZkWatcher = new ZKWatcher(conf,<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          getProcessName() + ":" + rpcServices.getSocketAddress().getPort() + "-clientZK", this,<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          false, true);<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      this.metaLocationSyncer = new MetaLocationSyncer(zooKeeper, clientZkWatcher, this);<a name="line.783"></a>
-<span class="sourceLineNo">784</span>      this.metaLocationSyncer.start();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      this.masterAddressSyncer = new MasterAddressSyncer(zooKeeper, clientZkWatcher, this);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.masterAddressSyncer.start();<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      // set cluster id is a one-go effort<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      ZKClusterId.setClusterId(clientZkWatcher, fileSystemManager.getClusterId());<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>    // Set the cluster as up.  If new RSs, they'll be waiting on this before<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    // going ahead with their startup.<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    boolean wasUp = this.clusterStatusTracker.isClusterUp();<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    if (!wasUp) this.clusterStatusTracker.setClusterUp();<a name="line.794"></a>
-<span class="sourceLineNo">795</span><a name="line.795"></a>
-<span class="sourceLineNo">796</span>    LOG.info("Active/primary master=" + this.serverName +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>        ", sessionid=0x" +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>        Long.toHexString(this.zooKeeper.getRecoverableZooKeeper().getSessionId()) +<a name="line.798"></a>
-<span class="sourceLineNo">799</span>        ", setting cluster-up flag (Was=" + wasUp + ")");<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>    // create/initialize the snapshot manager and other procedure managers<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    this.snapshotManager = new SnapshotManager();<a name="line.802"></a>
-<span class="sourceLineNo">803</span>    this.mpmHost = new MasterProcedureManagerHost();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    this.mpmHost.register(this.snapshotManager);<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    this.mpmHost.register(new MasterFlushTableProcedureManager());<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    this.mpmHost.loadProcedures(conf);<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    this.mpmHost.initialize(this, this.metricsMaster);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>  }<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>  private static final ImmutableSet&lt;Class&lt;?&gt;&gt; UNSUPPORTED_PROCEDURES =<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    ImmutableSet.of(RecoverMetaProcedure.class, AssignProcedure.class, UnassignProcedure.class,<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      MoveRegionProcedure.class);<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  /**<a name="line.814"></a>
-<span class="sourceLineNo">815</span>   * In HBASE-20811, we have introduced a new TRSP to assign/unassign/move regions, and it is<a name="line.815"></a>
-<span class="sourceLineNo">816</span>   * incompatible with the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. So we need to<a name="line.816"></a>
-<span class="sourceLineNo">817</span>   * make sure that there are none these procedures when upgrading. If there are, the master will<a name="line.817"></a>
-<span class="sourceLineNo">818</span>   * quit, you need to go back to the old version to finish these procedures first before upgrading.<a name="line.818"></a>
-<span class="sourceLineNo">819</span>   */<a name="line.819"></a>
-<span class="sourceLineNo">820</span>  private void checkUnsupportedProcedure(<a name="line.820"></a>
-<span class="sourceLineNo">821</span>      Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType)<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      throws HBaseIOException {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    // Confirm that we do not have unfinished assign/unassign related procedures. It is not easy to<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    // support both the old assign/unassign procedures and the new TransitRegionStateProcedure as<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    // there will be conflict in the code for AM. We should finish all these procedures before<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    // upgrading.<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    for (Class&lt;?&gt; clazz : UNSUPPORTED_PROCEDURES) {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt; procs = procsByType.get(clazz);<a name="line.828"></a>
-<span class="sourceLineNo">829</span>      if (procs != null) {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>        LOG.error(<a name="line.830"></a>
-<span class="sourceLineNo">831</span>          "Unsupported procedure type {} found, please rollback your master to the old" +<a name="line.831"></a>
-<span class="sourceLineNo">832</span>            " version to finish them, and then try to upgrade again. The full procedure list: {}",<a name="line.832"></a>
-<span class="sourceLineNo">833</span>          clazz, procs);<a name="line.833"></a>
-<span class="sourceLineNo">834</span>        throw new HBaseIOException("Unsupported procedure type " + clazz + " found");<a name="line.834"></a>
-<span class="sourceLineNo">835</span>      }<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    }<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    // A special check for SCP, as we do not support RecoverMetaProcedure any more so we need to<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    // make sure that no one will try to schedule it but SCP does have a state which will schedule<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    // it.<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    if (procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.840"></a>
-<span class="sourceLineNo">841</span>      .map(p -&gt; (ServerCrashProcedure) p).anyMatch(ServerCrashProcedure::isInRecoverMetaState)) {<a name="line.841"></a>
-<span class="sourceLineNo">842</span>      LOG.error("At least one ServerCrashProcedure is going to schedule a RecoverMetaProcedure," +<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        " which is not supported any more. Please rollback your master to the old version to" +<a name="line.843"></a>
-<span class="sourceLineNo">844</span>        " finish them, and then try to upgrade again.");<a name="line.844"></a>
-<span class="sourceLineNo">845</span>      throw new HBaseIOException("Unsupported procedure state found for ServerCrashProcedure");<a name="line.845"></a>
-<span class="sourceLineNo">846</span>    }<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
-<span class="sourceLineNo">848</span><a name="line.848"></a>
-<span class="sourceLineNo">849</span>  // Will be overriden in test to inject customized AssignmentManager<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  @VisibleForTesting<a name="line.850"></a>
-<span class="sourceLineNo">851</span>  protected AssignmentManager createAssignmentManager(MasterServices master) {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return new AssignmentManager(master);<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  /**<a name="line.855"></a>
-<span class="sourceLineNo">856</span>   * Finish initialization of HMaster after becoming the primary master.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * &lt;p/&gt;<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * The startup order is a bit complicated but very important, do not change it unless you know<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * what you are doing.<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   * &lt;ol&gt;<a name="line.860"></a>
-<span class="sourceLineNo">861</span>   * &lt;li&gt;Initialize file system based components - file system manager, wal manager, table<a name="line.861"></a>
-<span class="sourceLineNo">862</span>   * descriptors, etc&lt;/li&gt;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>   * &lt;li&gt;Publish cluster id&lt;/li&gt;<a name="line.863"></a>
-<span class="sourceLineNo">864</span>   * &lt;li&gt;Here comes the most complicated part - initialize server manager, assignment manager and<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * region server tracker<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * &lt;ol type='i'&gt;<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * &lt;li&gt;Create server manager&lt;/li&gt;<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * &lt;li&gt;Create procedure executor, load the procedures, but do not start workers. We will start it<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * later after we finish scheduling SCPs to avoid scheduling duplicated SCPs for the same<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * server&lt;/li&gt;<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * &lt;li&gt;Create assignment manager and start it, load the meta region state, but do not load data<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   * from meta region&lt;/li&gt;<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * &lt;li&gt;Start region server tracker, construct the online servers set and find out dead servers and<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * schedule SCP for them. The online servers will be constructed by scanning zk, and we will also<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   * scan the wal directory to find out possible live region servers, and the differences between<a name="line.875"></a>
-<span class="sourceLineNo">876</span>   * these two sets are the dead servers&lt;/li&gt;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>   * &lt;/ol&gt;<a name="line.877"></a>
-<span class="sourceLineNo">878</span>   * &lt;/li&gt;<a name="line.878"></a>
-<span class="sourceLineNo">879</span>   * &lt;li&gt;If this is a new deploy, schedule a InitMetaProcedure to initialize meta&lt;/li&gt;<a name="line.879"></a>
-<span class="sourceLineNo">880</span>   * &lt;li&gt;Start necessary service threads - balancer, catalog janior, executor services, and also the<a name="line.880"></a>
-<span class="sourceLineNo">881</span>   * procedure executor, etc. Notice that the balancer must be created first as assignment manager<a name="line.881"></a>
-<span class="sourceLineNo">882</span>   * may use it when assigning regions.&lt;/li&gt;<a name="line.882"></a>
-<span class="sourceLineNo">883</span>   * &lt;li&gt;Wait for meta to be initialized if necesssary, start table state manager.&lt;/li&gt;<a name="line.883"></a>
-<span class="sourceLineNo">884</span>   * &lt;li&gt;Wait for enough region servers to check-in&lt;/li&gt;<a name="line.884"></a>
-<span class="sourceLineNo">885</span>   * &lt;li&gt;Let assignment manager load data from meta and construct region states&lt;/li&gt;<a name="line.885"></a>
-<span class="sourceLineNo">886</span>   * &lt;li&gt;Start all other things such as chore services, etc&lt;/li&gt;<a name="line.886"></a>
-<span class="sourceLineNo">887</span>   * &lt;/ol&gt;<a name="line.887"></a>
-<span class="sourceLineNo">888</span>   * &lt;p/&gt;<a name="line.888"></a>
-<span class="sourceLineNo">889</span>   * Notice that now we will not schedule a special procedure to make meta online(unless the first<a name="line.889"></a>
-<span class="sourceLineNo">890</span>   * time where meta has not been created yet), we will rely on SCP to bring meta online.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>   */<a name="line.891"></a>
-<span class="sourceLineNo">892</span>  private void finishActiveMasterInitialization(MonitoredTask status) throws IOException,<a name="line.892"></a>
-<span class="sourceLineNo">893</span>          InterruptedException, KeeperException, ReplicationException {<a name="line.893"></a>
-<span class="sourceLineNo">894</span>    Thread zombieDetector = new Thread(new InitializationMonitor(this),<a name="line.894"></a>
-<span class="sourceLineNo">895</span>        "ActiveMasterInitializationMonitor-" + System.currentTimeMillis());<a name="line.895"></a>
-<span class="sourceLineNo">896</span>    zombieDetector.setDaemon(true);<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    zombieDetector.start();<a name="line.897"></a>
-<span class="sourceLineNo">898</span><a name="line.898"></a>
-<span class="sourceLineNo">899</span>    /*<a name="line.899"></a>
-<span class="sourceLineNo">900</span>     * We are active master now... go initialize components we need to run.<a name="line.900"></a>
-<span class="sourceLineNo">901</span>     */<a name="line.901"></a>
-<span class="sourceLineNo">902</span>    status.setStatus("Initializing Master file system");<a name="line.902"></a>
-<span class="sourceLineNo">903</span><a name="line.903"></a>
-<span class="sourceLineNo">904</span>    this.masterActiveTime = System.currentTimeMillis();<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // TODO: Do this using Dependency Injection, using PicoContainer, Guice or Spring.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>    // Initialize the chunkCreator<a name="line.906"></a>
-<span class="sourceLineNo">907</span>    initializeMemStoreChunkCreator();<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    this.fileSystemManager = new MasterFileSystem(conf);<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    this.walManager = new MasterWalManager(this);<a name="line.909"></a>
-<span class="sourceLineNo">910</span><a name="line.910"></a>
-<span class="sourceLineNo">911</span>    // enable table descriptors cache<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    this.tableDescriptors.setCacheOn();<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>    // warm-up HTDs cache on master initialization<a name="line.914"></a>
-<span class="sourceLineNo">915</span>    if (preLoadTableDescriptors) {<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      status.setStatus("Pre-loading table descriptors");<a name="line.916"></a>
-<span class="sourceLineNo">917</span>      this.tableDescriptors.getAll();<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    }<a name="line.918"></a>
-<span class="sourceLineNo">919</span><a name="line.919"></a>
-<span class="sourceLineNo">920</span>    // Publish cluster ID; set it in Master too. The superclass RegionServer does this later but<a name="line.920"></a>
-<span class="sourceLineNo">921</span>    // only after it has checked in with the Master. At least a few tests ask Master for clusterId<a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // before it has called its run method and before RegionServer has done the reportForDuty.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    ClusterId clusterId = fileSystemManager.getClusterId();<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    status.setStatus("Publishing Cluster ID " + clusterId + " in ZooKeeper");<a name="line.924"></a>
-<span class="sourceLineNo">925</span>    ZKClusterId.setClusterId(this.zooKeeper, fileSystemManager.getClusterId());<a name="line.925"></a>
-<span class="sourceLineNo">926</span>    this.clusterId = clusterId.toString();<a name="line.926"></a>
-<span class="sourceLineNo">927</span><a name="line.927"></a>
-<span class="sourceLineNo">928</span>    // Precaution. Put in place the old hbck1 lock file to fence out old hbase1s running their<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    // hbck1s against an hbase2 cluster; it could do damage. To skip this behavior, set<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    // hbase.write.hbck1.lock.file to false.<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    if (this.conf.getBoolean("hbase.write.hbck1.lock.file", true)) {<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      HBaseFsck.checkAndMarkRunningHbck(this.conf,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>          HBaseFsck.createLockRetryCounterFactory(this.conf).create());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    }<a name="line.934"></a>
-<span class="sourceLineNo">935</span><a name="line.935"></a>
-<span class="sourceLineNo">936</span>    status.setStatus("Initialize ServerManager and schedule SCP for crash servers");<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    this.serverManager = createServerManager(this);<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    createProcedureExecutor();<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    @SuppressWarnings("rawtypes")<a name="line.939"></a>
-<span class="sourceLineNo">940</span>    Map&lt;Class&lt;? extends Procedure&gt;, List&lt;Procedure&lt;MasterProcedureEnv&gt;&gt;&gt; procsByType =<a name="line.940"></a>
-<span class="sourceLineNo">941</span>      procedureExecutor.getActiveProceduresNoCopy().stream()<a name="line.941"></a>
-<span class="sourceLineNo">942</span>        .collect(Collectors.groupingBy(p -&gt; p.getClass()));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>    checkUnsupportedProcedure(procsByType);<a name="line.944"></a>
-<span class="sourceLineNo">945</span><a name="line.945"></a>
-<span class="sourceLineNo">946</span>    // Create Assignment Manager<a name="line.946"></a>
-<span class="sourceLineNo">947</span>    this.assignmentManager = createAssignmentManager(this);<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    this.assignmentManager.start();<a name="line.948"></a>
-<span class="sourceLineNo">949</span>    // TODO: TRSP can perform as the sub procedure for other procedures, so even if it is marked as<a name="line.949"></a>
-<span class="sourceLineNo">950</span>    // completed, it could still be in the procedure list. This is a bit strange but is another<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    // story, need to verify the implementation for ProcedureExecutor and ProcedureStore.<a name="line.951"></a>
-<span class="sourceLineNo">952</span>    List&lt;TransitRegionStateProcedure&gt; ritList =<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      procsByType.getOrDefault(TransitRegionStateProcedure.class, Collections.emptyList()).stream()<a name="line.953"></a>
-<span class="sourceLineNo">954</span>        .filter(p -&gt; !p.isFinished()).map(p -&gt; (TransitRegionStateProcedure) p)<a name="line.954"></a>
-<span class="sourceLineNo">955</span>        .collect(Collectors.toList());<a name="line.955"></a>
-<span class="sourceLineNo">956</span>    this.assignmentManager.setupRIT(ritList);<a name="line.956"></a>
-<span class="sourceLineNo">957</span><a name="line.957"></a>
-<span class="sourceLineNo">958</span>    // Start RegionServerTracker with listing of servers found with exiting SCPs -- these should<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    // be registered in the deadServers set -- and with the list of servernames out on the<a name="line.959"></a>
-<span class="sourceLineNo">960</span>    // filesystem that COULD BE 'alive' (we'll schedule SCPs for each and let SCP figure it out).<a name="line.960"></a>
-<span class="sourceLineNo">961</span>    // We also pass dirs that are already 'splitting'... so we can do some checks down in tracker.<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    // TODO: Generate the splitting and live Set in one pass instead of two as we currently do.<a name="line.962"></a>
-<span class="sourceLineNo">963</span>    this.regionServerTracker = new RegionServerTracker(zooKeeper, this, this.serverManager);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    this.regionServerTracker.start(<a name="line.964"></a>
-<span class="sourceLineNo">965</span>      procsByType.getOrDefault(ServerCrashProcedure.class, Collections.emptyList()).stream()<a name="line.965"></a>
-<span class="sourceLineNo">966</span>        .map(p -&gt; (ServerCrashProcedure) p).map(p -&gt; p.getServerName()).collect(Collectors.toSet()),<a name="line.966"></a>
-<span class="sourceLineNo">967</span>      walManager.getLiveServersFromWALDir(), walManager.getSplittingServersFromWALDir());<a name="line.967"></a>
-<span class="sourceLineNo">968</span>    // This manager will be started AFTER hbase:meta is confirmed on line.<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    // hbase.mirror.table.state.to.zookeeper is so hbase1 clients can connect. They read table<a name="line.969"></a>
-<span class="sourceLineNo">970</span>    // state from zookeeper while hbase2 reads it from hbase:meta. Disable if no hbase1 clients.<a name="line.970"></a>
-<span class="sourceLineNo">971</span>    this.tableStateManager =<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      this.conf.getBoolean(MirroringTableStateManager.MIRROR_TABLE_STATE_TO_ZK_KEY, true)<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        ?<a name="line.973"></a>
-<span class="sourceLineNo">974</span>        new MirroringTableStateManager(this):<a name="line.974"></a>
-<span class="sourceLineNo">975</span>        new TableStateManager(this);<a name="line.975"></a>
-<span class="sourceLineNo">976</span><a name="line.976"></a>
-<span class="sourceLineNo">977</span>    status.setStatus("Initializing ZK system trackers");<a name="line.977"></a>
-<span class="sourceLineNo">978</span>    initializeZKBasedSystemTrackers();<a name="line.978"></a>
-<span class="sourceLineNo">979</span>    status.setStatus("Loading last flushed sequence id of regions");<a name="line.979"></a>
-<span class="sourceLineNo">980</span>    try {<a name="line.980"></a>
-<span class="sourceLineNo">981</span>      this.serverManager.loadLastFlushedSequenceIds();<a name="line.981"></a>
-<span class="sourceLineNo">982</span>    } catch (IOException e) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>      LOG.debug("Failed to load last flushed sequence id of regions"<a name="line.983"></a>
-<span class="sourceLineNo">984</span>          + " from file system", e);<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span>    // Set ourselves as active Master now our claim has succeeded up in zk.<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    this.activeMaster = true;<a name="line.987"></a>
-<span class="sourceLineNo">988</span><a name="line.988"></a>
-<span class="sourceLineNo">989</span>    // This is for backwards compatibility<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    // See HBASE-11393<a name="line.990"></a>
-<span class="sourceLineNo">991</span>    status.setStatus("Update TableCFs node in ZNode");<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    ReplicationPeerConfigUpgrader tableCFsUpdater =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>        new ReplicationPeerConfigUpgrader(zooKee

<TRUNCATED>

[40/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index c354724..d273a37 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -229,13 +229,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<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/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index f867663..60a8fa3 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -710,20 +710,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
----------------------------------------------------------------------
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 3bd22b5..23060c2 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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
index edd4045..f7fcff8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html
@@ -1209,7 +1209,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.438">init</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.433">init</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Used to initialize the WAL. Usually just call rollWriter to create the first log writer.</div>
 <dl>
@@ -1224,7 +1224,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>registerWALActionsListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.443">registerWALActionsListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.438">registerWALActionsListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#registerWALActionsListener-org.apache.hadoop.hbase.regionserver.wal.WALActionsListener-">WAL</a></code></span></div>
 <div class="block">Registers WALActionsListener</div>
 <dl>
@@ -1239,7 +1239,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterWALActionsListener</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.448">unregisterWALActionsListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.443">unregisterWALActionsListener</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#unregisterWALActionsListener-org.apache.hadoop.hbase.regionserver.wal.WALActionsListener-">WAL</a></code></span></div>
 <div class="block">Unregisters WALActionsListener</div>
 <dl>
@@ -1254,7 +1254,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALCoprocessorHost</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.453">getCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver.wal">WALCoprocessorHost</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.448">getCoprocessorHost</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#getCoprocessorHost--">getCoprocessorHost</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a></code></dd>
@@ -1269,7 +1269,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>startCacheFlush</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.458">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.453">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;byte[]&gt;&nbsp;families)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#startCacheFlush-byte:A-java.util.Set-">WAL</a></code></span></div>
 <div class="block">WAL keeps track of the sequence numbers that are as yet not flushed im memstores
@@ -1301,7 +1301,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>startCacheFlush</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.463">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.458">startCacheFlush</a>(byte[]&nbsp;encodedRegionName,
                             <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;byte[],<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;familyToSeq)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1315,7 +1315,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>completeCacheFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.468">completeCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.463">completeCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#completeCacheFlush-byte:A-">WAL</a></code></span></div>
 <div class="block">Complete the cache flush.</div>
 <dl>
@@ -1335,7 +1335,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>abortCacheFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.473">abortCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.468">abortCacheFlush</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#abortCacheFlush-byte:A-">WAL</a></code></span></div>
 <div class="block">Abort a cache flush. Call if the flush fails. Note that the only recovery
  for an aborted flush currently is a restart of the regionserver so the
@@ -1354,7 +1354,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getEarliestMemStoreSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.478">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.473">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#getEarliestMemStoreSeqNum-byte:A-">WAL</a></code></span></div>
 <div class="block">Gets the earliest unflushed sequence id in the memstore for the region.</div>
 <dl>
@@ -1373,7 +1373,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getEarliestMemStoreSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.484">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.479">getEarliestMemStoreSeqNum</a>(byte[]&nbsp;encodedRegionName,
                                       byte[]&nbsp;familyName)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#getEarliestMemStoreSeqNum-byte:A-byte:A-">WAL</a></code></span></div>
 <div class="block">Gets the earliest unflushed sequence id in the memstore for the store.</div>
@@ -1394,7 +1394,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriter</h4>
-<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.497">rollWriter</a>()
+<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.492">rollWriter</a>()
                     throws <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FailedLogCloseException.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FailedLogCloseException</a>,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#rollWriter--">WAL</a></code></span></div>
@@ -1422,7 +1422,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>computeFilename</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.506">computeFilename</a>(long&nbsp;filenum)</pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.501">computeFilename</a>(long&nbsp;filenum)</pre>
 <div class="block">This is a convenience method that computes a new filename with a given file-number.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1438,7 +1438,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getCurrentFileName</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.519">getCurrentFileName</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.514">getCurrentFileName</a>()</pre>
 <div class="block">This is a convenience method that computes a new filename with a given using the current WAL
  file-number</div>
 <dl>
@@ -1453,7 +1453,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getNewPath</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.526">getNewPath</a>()
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.521">getNewPath</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">retrieve the next path to use for writing. Increments the internal filenum.</div>
 <dl>
@@ -1468,7 +1468,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getOldPath</h4>
-<pre>org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.537">getOldPath</a>()</pre>
+<pre>org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.532">getOldPath</a>()</pre>
 </li>
 </ul>
 <a name="tellListenersAboutPreLogRoll-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">
@@ -1477,7 +1477,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>tellListenersAboutPreLogRoll</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.550">tellListenersAboutPreLogRoll</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.545">tellListenersAboutPreLogRoll</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                           org.apache.hadoop.fs.Path&nbsp;newPath)
                                    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">Tell listeners about pre log roll.</div>
@@ -1493,7 +1493,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>tellListenersAboutPostLogRoll</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.564">tellListenersAboutPostLogRoll</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.559">tellListenersAboutPostLogRoll</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                            org.apache.hadoop.fs.Path&nbsp;newPath)
                                     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">Tell listeners about post log roll.</div>
@@ -1509,7 +1509,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumRolledLogFiles</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.577">getNumRolledLogFiles</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.572">getNumRolledLogFiles</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of rolled log files</dd>
@@ -1522,7 +1522,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumLogFiles</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.583">getNumLogFiles</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.578">getNumLogFiles</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the number of log files in use</dd>
@@ -1535,7 +1535,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>findRegionsToForceFlush</h4>
-<pre>byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.594">findRegionsToForceFlush</a>()
+<pre>byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.589">findRegionsToForceFlush</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">If the number of un-archived WAL files is greater than maximum allowed, check the first
  (oldest) WAL file, and returns those regions which should be flushed so that it can be
@@ -1554,7 +1554,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanOldLogs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.619">cleanOldLogs</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.614">cleanOldLogs</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed.</div>
 <dl>
@@ -1569,7 +1569,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALArchivePath</h4>
-<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.649">getWALArchivePath</a>(org.apache.hadoop.fs.Path&nbsp;archiveDir,
+<pre>public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.644">getWALArchivePath</a>(org.apache.hadoop.fs.Path&nbsp;archiveDir,
                                                           org.apache.hadoop.fs.Path&nbsp;p)</pre>
 </li>
 </ul>
@@ -1579,7 +1579,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>archiveLogFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.653">archiveLogFile</a>(org.apache.hadoop.fs.Path&nbsp;p)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.648">archiveLogFile</a>(org.apache.hadoop.fs.Path&nbsp;p)
                      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>
@@ -1593,7 +1593,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>logRollAndSetupWalProps</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.673">logRollAndSetupWalProps</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.668">logRollAndSetupWalProps</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                              org.apache.hadoop.fs.Path&nbsp;newPath,
                                              long&nbsp;oldFileLen)</pre>
 </li>
@@ -1606,7 +1606,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>replaceWriter</h4>
-<pre>org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.709">replaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.704">replaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                         org.apache.hadoop.fs.Path&nbsp;newPath,
                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;nextWriter)
                                  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>
@@ -1641,7 +1641,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>blockOnSync</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.716">blockOnSync</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.711">blockOnSync</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;syncFuture)
                           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>
@@ -1655,7 +1655,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>ensureIOException</h4>
-<pre>private static&nbsp;<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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.740">ensureIOException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
+<pre>private static&nbsp;<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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.735">ensureIOException</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;t)</pre>
 </li>
 </ul>
 <a name="convertInterruptedExceptionToIOException-java.lang.InterruptedException-">
@@ -1664,7 +1664,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>convertInterruptedExceptionToIOException</h4>
-<pre>private&nbsp;<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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.744">convertInterruptedExceptionToIOException</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>&nbsp;ie)</pre>
+<pre>private&nbsp;<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;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.739">convertInterruptedExceptionToIOException</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>&nbsp;ie)</pre>
 </li>
 </ul>
 <a name="rollWriter-boolean-">
@@ -1673,7 +1673,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>rollWriter</h4>
-<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.752">rollWriter</a>(boolean&nbsp;force)
+<pre>public&nbsp;byte[][]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.747">rollWriter</a>(boolean&nbsp;force)
                     throws <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FailedLogCloseException.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FailedLogCloseException</a>,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#rollWriter-boolean-">WAL</a></code></span></div>
@@ -1704,7 +1704,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.796">getLogFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.791">getLogFileSize</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the size of log files in use</dd>
@@ -1717,7 +1717,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>requestLogRoll</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.801">requestLogRoll</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.796">requestLogRoll</a>()</pre>
 </li>
 </ul>
 <a name="getFiles--">
@@ -1726,7 +1726,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getFiles</h4>
-<pre>org.apache.hadoop.fs.FileStatus[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.810">getFiles</a>()
+<pre>org.apache.hadoop.fs.FileStatus[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.805">getFiles</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Get the backing files associated with this WAL.</div>
 <dl>
@@ -1743,7 +1743,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.815">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.810">shutdown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#shutdown--">WAL</a></code></span></div>
 <div class="block">Stop accepting new writes. If we have unsynced writes still in buffer, sync them.
@@ -1762,7 +1762,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.835">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.830">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#close--">WAL</a></code></span></div>
 <div class="block">Caller no longer needs any edits from this WAL. Implementers are free to reclaim
@@ -1786,7 +1786,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.873">updateStore</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.868">updateStore</a>(byte[]&nbsp;encodedRegionName,
                         byte[]&nbsp;familyName,
                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&nbsp;sequenceid,
                         boolean&nbsp;onlyIfGreater)</pre>
@@ -1809,7 +1809,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getSyncFuture</h4>
-<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.878">getSyncFuture</a>(long&nbsp;sequence)</pre>
+<pre>protected final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.873">getSyncFuture</a>(long&nbsp;sequence)</pre>
 </li>
 </ul>
 <a name="requestLogRoll-boolean-">
@@ -1818,7 +1818,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>requestLogRoll</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.882">requestLogRoll</a>(boolean&nbsp;tooFewReplicas)</pre>
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.877">requestLogRoll</a>(boolean&nbsp;tooFewReplicas)</pre>
 </li>
 </ul>
 <a name="getUnflushedEntriesCount--">
@@ -1827,7 +1827,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getUnflushedEntriesCount</h4>
-<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.890">getUnflushedEntriesCount</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.885">getUnflushedEntriesCount</a>()</pre>
 </li>
 </ul>
 <a name="isUnflushedEntries--">
@@ -1836,7 +1836,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>isUnflushedEntries</h4>
-<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.896">isUnflushedEntries</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.891">isUnflushedEntries</a>()</pre>
 </li>
 </ul>
 <a name="atHeadOfRingBufferEventHandlerAppend--">
@@ -1845,7 +1845,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>atHeadOfRingBufferEventHandlerAppend</h4>
-<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.904">atHeadOfRingBufferEventHandlerAppend</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.899">atHeadOfRingBufferEventHandlerAppend</a>()</pre>
 <div class="block">Exposed for testing only. Use to tricks like halt the ring buffer appending.</div>
 </li>
 </ul>
@@ -1857,7 +1857,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>protected final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.908">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;writer,
+<pre>protected final&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.903">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;writer,
                                <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSWALEntry</a>&nbsp;entry)
                         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>
@@ -1872,7 +1872,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>postAppend</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.941">postAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;e,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.936">postAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.Entry.html" title="class in org.apache.hadoop.hbase.wal">WAL.Entry</a>&nbsp;e,
                         long&nbsp;elapsedTime)
                  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>
@@ -1887,7 +1887,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>postSync</h4>
-<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.954">postSync</a>(long&nbsp;timeInNanos,
+<pre>protected final&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.949">postSync</a>(long&nbsp;timeInNanos,
                               int&nbsp;handlerSyncs)</pre>
 </li>
 </ul>
@@ -1897,7 +1897,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>stampSequenceIdAndPublishToRingBuffer</h4>
-<pre>protected final&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.968">stampSequenceIdAndPublishToRingBuffer</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
+<pre>protected final&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.963">stampSequenceIdAndPublishToRingBuffer</a>(<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/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
                                                            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edits,
                                                            boolean&nbsp;inMemstore,
@@ -1915,7 +1915,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.991">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.986">toString</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html#toString--">WAL</a></code></span></div>
 <div class="block">Human readable identifying information about the state of this WAL.
  Implementors are encouraged to include information appropriate for debugging.
@@ -1935,7 +1935,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFileSizeIfBeingWritten</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1002">getLogFileSizeIfBeingWritten</a>(org.apache.hadoop.fs.Path&nbsp;path)</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/OptionalLong.html?is-external=true" title="class or interface in java.util">OptionalLong</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.997">getLogFileSizeIfBeingWritten</a>(org.apache.hadoop.fs.Path&nbsp;path)</pre>
 <div class="block">if the given <code>path</code> is being written currently, then return its length.
  <p>
  This is used by replication to prevent replicating unacked log entries. See
@@ -1952,7 +1952,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>append</h4>
-<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1030">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
+<pre>public abstract&nbsp;long&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1025">append</a>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
                             <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
                             <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edits,
                             boolean&nbsp;inMemstore)
@@ -1994,7 +1994,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>doAppend</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1033">doAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;writer,
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1028">doAppend</a>(<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;writer,
                                  <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/FSWALEntry.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FSWALEntry</a>&nbsp;entry)
                           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>
@@ -2009,7 +2009,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>createWriterInstance</h4>
-<pre>protected abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1035">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
+<pre>protected abstract&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1030">createWriterInstance</a>(org.apache.hadoop.fs.Path&nbsp;path)
                                    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/util/CommonFSUtils.StreamLacksCapabilityException.html" title="class in org.apache.hadoop.hbase.util">CommonFSUtils.StreamLacksCapabilityException</a></pre>
 <dl>
@@ -2027,7 +2027,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>doReplaceWriter</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1038">doReplaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1033">doReplaceWriter</a>(org.apache.hadoop.fs.Path&nbsp;oldPath,
                                         org.apache.hadoop.fs.Path&nbsp;newPath,
                                         <a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html" title="type parameter in AbstractFSWAL">W</a>&nbsp;nextWriter)
                                  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>
@@ -2043,7 +2043,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>doShutdown</h4>
-<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1041">doShutdown</a>()
+<pre>protected abstract&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1036">doShutdown</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2057,7 +2057,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>doCheckLogLowReplication</h4>
-<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1043">doCheckLogLowReplication</a>()</pre>
+<pre>protected abstract&nbsp;boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1038">doCheckLogLowReplication</a>()</pre>
 </li>
 </ul>
 <a name="checkLogLowReplication-long-">
@@ -2066,7 +2066,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>checkLogLowReplication</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1045">checkLogLowReplication</a>(long&nbsp;checkInterval)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1040">checkLogLowReplication</a>(long&nbsp;checkInterval)</pre>
 </li>
 </ul>
 <a name="getPipeline--">
@@ -2075,7 +2075,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getPipeline</h4>
-<pre>abstract&nbsp;org.apache.hadoop.hdfs.protocol.DatanodeInfo[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1068">getPipeline</a>()</pre>
+<pre>abstract&nbsp;org.apache.hadoop.hdfs.protocol.DatanodeInfo[]&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1063">getPipeline</a>()</pre>
 <div class="block">This method gets the pipeline for the current WAL.</div>
 </li>
 </ul>
@@ -2085,7 +2085,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogReplication</h4>
-<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1074">getLogReplication</a>()</pre>
+<pre>abstract&nbsp;int&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1069">getLogReplication</a>()</pre>
 <div class="block">This method gets the datanode replication count for the current WAL.</div>
 </li>
 </ul>
@@ -2095,7 +2095,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>split</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1076">split</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1071">split</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                           org.apache.hadoop.fs.Path&nbsp;p)
                    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>
@@ -2110,7 +2110,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockList">
 <li class="blockList">
 <h4>usage</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1094">usage</a>()</pre>
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1089">usage</a>()</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -2119,7 +2119,7 @@ implements <a href="../../../../../../org/apache/hadoop/hbase/wal/WAL.html" titl
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1109">main</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;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.html#line.1104">main</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;args)
                  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">Pass one or more log file names and it will either dump out a text version on
  <code>stdout</code> or split the specified log files.</div>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
----------------------------------------------------------------------
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 19354d1..feee307 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,9 +247,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index f8e4b11..3c7146a 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -160,8 +160,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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
----------------------------------------------------------------------
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 30c4e73..cd3870f 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -207,8 +207,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <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>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 7ba3a64..dfa02b5 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/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" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
index 108aee9..322b353 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.104">JVMClusterUtil.MasterThread</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.105">JVMClusterUtil.MasterThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 <div class="block">Datastructure to hold Master Thread and Master instance</div>
 </li>
@@ -241,7 +241,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>master</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.105">master</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.106">master</a></pre>
 </li>
 </ul>
 </li>
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MasterThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.107">MasterThread</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;m,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.108">MasterThread</a>(<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;m,
                     int&nbsp;index)</pre>
 </li>
 </ul>
@@ -276,7 +276,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMaster</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.113">getMaster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/master/HMaster.html" title="class in org.apache.hadoop.hbase.master">HMaster</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.MasterThread.html#line.114">getMaster</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the master</dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
index b2075ce..eeee346 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.45">JVMClusterUtil.RegionServerThread</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.html#line.46">JVMClusterUtil.RegionServerThread</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html?is-external=true" title="class or interface in java.lang">Thread</a></pre>
 <div class="block">Datastructure to hold RegionServer Thread and RegionServer instance</div>
 </li>
@@ -248,7 +248,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>regionServer</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.46">regionServer</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.47">regionServer</a></pre>
 </li>
 </ul>
 </li>
@@ -265,7 +265,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RegionServerThread</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.48">RegionServerThread</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;r,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.49">RegionServerThread</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;r,
                           int&nbsp;index)</pre>
 </li>
 </ul>
@@ -283,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionServer</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.54">getRegionServer</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionServer.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionServer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.55">getRegionServer</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the region server</dd>
@@ -296,7 +296,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>waitForServerOnline</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.62">waitForServerOnline</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/util/JVMClusterUtil.RegionServerThread.html#line.63">waitForServerOnline</a>()</pre>
 <div class="block">Block until the region server has come online, indicating it is ready
  to be used.</div>
 </li>


[38/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
index dbd06e5..8487361 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html
@@ -216,38 +216,34 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 </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/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#factory">factory</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/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#listeners">listeners</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/wal/RegionGroupingProvider.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private 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/wal/RegionGroupingProvider.html#META_WAL_GROUP_NAME">META_WAL_GROUP_NAME</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#providerClass">providerClass</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/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/wal/RegionGroupingProvider.html#providerId">providerId</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/wal/RegionGroupingProvider.html#REGION_GROUPING_STRATEGY">REGION_GROUPING_STRATEGY</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private <a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#strategy">strategy</a></span></code>&nbsp;</td>
 </tr>
@@ -419,26 +415,13 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 </dl>
 </li>
 </ul>
-<a name="DELEGATE_PROVIDER_CLASS">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>DELEGATE_PROVIDER_CLASS</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/wal/RegionGroupingProvider.html#line.124">DELEGATE_PROVIDER_CLASS</a></pre>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.RegionGroupingProvider.DELEGATE_PROVIDER_CLASS">Constant Field Values</a></dd>
-</dl>
-</li>
-</ul>
 <a name="DEFAULT_DELEGATE_PROVIDER">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_DELEGATE_PROVIDER</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/wal/RegionGroupingProvider.html#line.126">DEFAULT_DELEGATE_PROVIDER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.124">DEFAULT_DELEGATE_PROVIDER</a></pre>
 </li>
 </ul>
 <a name="META_WAL_GROUP_NAME">
@@ -447,7 +430,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>META_WAL_GROUP_NAME</h4>
-<pre>private 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/wal/RegionGroupingProvider.html#line.129">META_WAL_GROUP_NAME</a></pre>
+<pre>private 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/wal/RegionGroupingProvider.html#line.127">META_WAL_GROUP_NAME</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.RegionGroupingProvider.META_WAL_GROUP_NAME">Constant Field Values</a></dd>
@@ -460,7 +443,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>cached</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.132">cached</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentMap.html?is-external=true" title="class or interface in java.util.concurrent">ConcurrentMap</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.130">cached</a></pre>
 <div class="block">A group-provider mapping, make sure one-one rather than many-one mapping</div>
 </li>
 </ul>
@@ -470,7 +453,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createLock</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</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/wal/RegionGroupingProvider.html#line.134">createLock</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/KeyLocker.html" title="class in org.apache.hadoop.hbase.util">KeyLocker</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/wal/RegionGroupingProvider.html#line.132">createLock</a></pre>
 </li>
 </ul>
 <a name="strategy">
@@ -479,7 +462,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>strategy</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.136">strategy</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.RegionGroupingStrategy.html" title="interface in org.apache.hadoop.hbase.wal">RegionGroupingProvider.RegionGroupingStrategy</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.134">strategy</a></pre>
 </li>
 </ul>
 <a name="factory">
@@ -488,7 +471,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>factory</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.137">factory</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.135">factory</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -497,7 +480,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.138">conf</a></pre>
+<pre>private&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.136">conf</a></pre>
 </li>
 </ul>
 <a name="listeners">
@@ -506,7 +489,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>listeners</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/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.139">listeners</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/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.137">listeners</a></pre>
 </li>
 </ul>
 <a name="providerId">
@@ -515,7 +498,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>providerId</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/wal/RegionGroupingProvider.html#line.140">providerId</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/wal/RegionGroupingProvider.html#line.138">providerId</a></pre>
 </li>
 </ul>
 <a name="providerClass">
@@ -524,7 +507,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>providerClass</h4>
-<pre>private&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.141">providerClass</a></pre>
+<pre>private&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.139">providerClass</a></pre>
 </li>
 </ul>
 </li>
@@ -576,7 +559,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.144">init</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;factory,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.142">init</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;factory,
                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                  <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;providerId)
           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>
@@ -600,7 +583,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createProvider</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.164">createProvider</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;group)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.161">createProvider</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;group)
                             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>
@@ -614,7 +597,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.173">getWALs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.170">getWALs</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getWALs--">getWALs</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a></code></dd>
@@ -629,7 +612,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.177">getWAL</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;group)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.174">getWAL</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;group)
             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>
@@ -643,7 +626,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.196">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.193">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
            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>
@@ -663,7 +646,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.216">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.213">shutdown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#shutdown--">WALProvider</a></code></span></div>
 <div class="block">persist outstanding WALs to storage and stop accepting new appends. This method serves as
@@ -683,7 +666,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.236">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.233">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#close--">WALProvider</a></code></span></div>
 <div class="block">shutdown utstanding WALs and clean up any persisted state. Call this method only when you will
@@ -703,7 +686,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumLogFiles</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.265">getNumLogFiles</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.262">getNumLogFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getNumLogFiles--">WALProvider</a></code></span></div>
 <div class="block">Get number of the log files this provider is managing</div>
 <dl>
@@ -718,7 +701,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getLogFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.274">getLogFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.271">getLogFileSize</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#getLogFileSize--">WALProvider</a></code></span></div>
 <div class="block">Get size of the log files this provider is managing</div>
 <dl>
@@ -733,7 +716,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>addWALActionsListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.283">addWALActionsListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#line.280">addWALActionsListener</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALActionsListener</a>&nbsp;listener)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html#addWALActionsListener-org.apache.hadoop.hbase.regionserver.wal.WALActionsListener-">WALProvider</a></code></span></div>
 <div class="block">Add a <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.html" title="interface in org.apache.hadoop.hbase.regionserver.wal"><code>WALActionsListener</code></a>.
  <p>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
index 46f12cf..df7002f 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALFactory.html
@@ -178,30 +178,22 @@ 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/wal/WALFactory.html#DEFAULT_WAL_PROVIDER">DEFAULT_WAL_PROVIDER</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) static <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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
-</tr>
-<tr class="rowColor">
 <td class="colFirst"><code>(package 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/wal/WALFactory.html#factoryId">factoryId</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/wal/WALFactory.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private <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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#logReaderClass">logReaderClass</a></span></code>
 <div class="block">Configuration-specified WAL Reader used when a custom reader is requested</div>
 </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/wal/WALFactory.html#META_WAL_PROVIDER">META_WAL_PROVIDER</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/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER">META_WAL_PROVIDER</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
@@ -229,10 +221,6 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <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/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</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/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></span></code>&nbsp;</td>
-</tr>
 </table>
 </li>
 </ul>
@@ -381,8 +369,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i16" class="altColor">
 <td class="colFirst"><code><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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clsKey,
-                <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;key,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                 <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;defaultValue)</code>&nbsp;</td>
 </tr>
 <tr id="i17" class="rowColor">
@@ -456,61 +443,26 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <pre>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/wal/WALFactory.html#line.82">DEFAULT_WAL_PROVIDER</a></pre>
 </li>
 </ul>
-<a name="WAL_PROVIDER_CLASS">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>WAL_PROVIDER_CLASS</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/wal/WALFactory.html#line.83">WAL_PROVIDER_CLASS</a></pre>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER_CLASS">Constant Field Values</a></dd>
-</dl>
-</li>
-</ul>
-<a name="DEFAULT_WAL_PROVIDER_CLASS">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>DEFAULT_WAL_PROVIDER_CLASS</h4>
-<pre>static final&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.84">DEFAULT_WAL_PROVIDER_CLASS</a></pre>
-</li>
-</ul>
 <a name="META_WAL_PROVIDER">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>META_WAL_PROVIDER</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/wal/WALFactory.html#line.86">META_WAL_PROVIDER</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.84">META_WAL_PROVIDER</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
-<a name="META_WAL_PROVIDER_CLASS">
-<!--   -->
-</a>
-<ul class="blockList">
-<li class="blockList">
-<h4>META_WAL_PROVIDER_CLASS</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/wal/WALFactory.html#line.87">META_WAL_PROVIDER_CLASS</a></pre>
-<dl>
-<dt><span class="seeLabel">See Also:</span></dt>
-<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER_CLASS">Constant Field Values</a></dd>
-</dl>
-</li>
-</ul>
 <a name="factoryId">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>factoryId</h4>
-<pre>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/wal/WALFactory.html#line.89">factoryId</a></pre>
+<pre>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/wal/WALFactory.html#line.86">factoryId</a></pre>
 </li>
 </ul>
 <a name="provider">
@@ -519,7 +471,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>provider</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.90">provider</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.87">provider</a></pre>
 </li>
 </ul>
 <a name="metaProvider">
@@ -528,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>metaProvider</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.94">metaProvider</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.91">metaProvider</a></pre>
 </li>
 </ul>
 <a name="logReaderClass">
@@ -537,7 +489,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>logReaderClass</h4>
-<pre>private final&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.99">logReaderClass</a></pre>
+<pre>private final&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/AbstractFSWALProvider.Reader.html" title="interface in org.apache.hadoop.hbase.wal">AbstractFSWALProvider.Reader</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.96">logReaderClass</a></pre>
 <div class="block">Configuration-specified WAL Reader used when a custom reader is requested</div>
 </li>
 </ul>
@@ -547,7 +499,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>timeoutMillis</h4>
-<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.104">timeoutMillis</a></pre>
+<pre>private final&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.101">timeoutMillis</a></pre>
 <div class="block">How long to attempt opening in-recovery wals</div>
 </li>
 </ul>
@@ -557,7 +509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.106">conf</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.103">conf</a></pre>
 </li>
 </ul>
 <a name="singleton">
@@ -566,7 +518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>singleton</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.420">singleton</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.396">singleton</a></pre>
 </li>
 </ul>
 <a name="SINGLETON_ID">
@@ -575,7 +527,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SINGLETON_ID</h4>
-<pre>private 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/wal/WALFactory.html#line.421">SINGLETON_ID</a></pre>
+<pre>private 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/wal/WALFactory.html#line.397">SINGLETON_ID</a></pre>
 </li>
 </ul>
 </li>
@@ -592,7 +544,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.109">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.106">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="WALFactory-org.apache.hadoop.conf.Configuration-java.lang.String-">
@@ -601,7 +553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.194">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.173">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <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;factoryId)
            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>
@@ -621,7 +573,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALFactory</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.208">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.187">WALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                   <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;factoryId,
                   boolean&nbsp;enableSyncReplicationWALProvider)
            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>
@@ -652,17 +604,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultProvider</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.126">getDefaultProvider</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html" title="enum in org.apache.hadoop.hbase.wal">WALFactory.Providers</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.123">getDefaultProvider</a>()</pre>
 </li>
 </ul>
-<a name="getProviderClass-java.lang.String-java.lang.String-java.lang.String-">
+<a name="getProviderClass-java.lang.String-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getProviderClass</h4>
-<pre>public&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.137">getProviderClass</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;clsKey,
-                                                     <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;key,
+<pre>public&nbsp;<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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.128">getProviderClass</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;key,
                                                      <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;defaultValue)</pre>
 </li>
 </ul>
@@ -672,7 +623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createProvider</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.177">createProvider</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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;&nbsp;clazz)
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.156">createProvider</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;? extends <a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&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="throwsLabel">Throws:</span></dt>
@@ -686,7 +637,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.241">close</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.219">close</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Shutdown all WALs and clean up any underlying storage.
  Use only when you will not need to replay and edits that have gone to any wals from this
@@ -703,7 +654,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.258">shutdown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.236">shutdown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Tell the underlying WAL providers to shut down, but do not clean up underlying storage.
  If you are not ending cleanly and will need to replay edits from this factory's wals,
@@ -720,7 +671,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALs</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.274">getWALs</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.252">getWALs</a>()</pre>
 </li>
 </ul>
 <a name="getMetaProvider--">
@@ -729,7 +680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaProvider</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">getMetaProvider</a>()
+<pre><a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.257">getMetaProvider</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -743,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWAL</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.303">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.html" title="interface in org.apache.hadoop.hbase.wal">WAL</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.279">getWAL</a>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;region)
            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="paramLabel">Parameters:</span></dt>
@@ -759,7 +710,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.313">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.289">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path)
                         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>
@@ -774,7 +725,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.324">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.300">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
                         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>
@@ -795,7 +746,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.329">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.305">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter,
                                boolean&nbsp;allowCustom)
@@ -812,7 +763,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.401">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.377">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                           org.apache.hadoop.fs.Path&nbsp;path)
                                    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">Create a writer for the WAL.
@@ -834,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.411">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.387">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path)
                                               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">Should be package-private, visible for recovery testing.
@@ -853,7 +804,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getInstance</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.400">getInstance</a>(org.apache.hadoop.conf.Configuration&nbsp;configuration)</pre>
 </li>
 </ul>
 <a name="createReader-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.conf.Configuration-">
@@ -862,7 +813,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.448">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.424">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                       org.apache.hadoop.fs.Path&nbsp;path,
                                       org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                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>
@@ -882,7 +833,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReader</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.458">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.434">createReader</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                org.apache.hadoop.fs.Path&nbsp;path,
                                org.apache.hadoop.conf.Configuration&nbsp;configuration,
                                <a href="../../../../../org/apache/hadoop/hbase/util/CancelableProgressable.html" title="interface in org.apache.hadoop.hbase.util">CancelableProgressable</a>&nbsp;reporter)
@@ -903,7 +854,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createReaderIgnoreCustomClass</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.469">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.445">createReaderIgnoreCustomClass</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                        org.apache.hadoop.fs.Path&nbsp;path,
                                                        org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                                 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>
@@ -924,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createRecoveredEditsWriter</h4>
-<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.479">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.455">createRecoveredEditsWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                      org.apache.hadoop.fs.Path&nbsp;path,
                                                      org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                               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>
@@ -944,7 +895,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALWriter</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.491">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.Writer.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider.Writer</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.467">createWALWriter</a>(org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                  org.apache.hadoop.fs.Path&nbsp;path,
                                                  org.apache.hadoop.conf.Configuration&nbsp;configuration)
                                           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>
@@ -964,7 +915,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.497">getWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.473">getWALProvider</a>()</pre>
 </li>
 </ul>
 <a name="getMetaWALProvider--">
@@ -973,7 +924,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getMetaWALProvider</h4>
-<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.501">getMetaWALProvider</a>()</pre>
+<pre>public final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALFactory.html#line.477">getMetaWALProvider</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
index 35852ba..c37a18b 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALProvider.html
@@ -251,14 +251,10 @@
 <td class="colLast"><span class="typeNameLabel">WALFactory.Providers.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.Providers.html#clazz">clazz</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
-<td class="colFirst"><code>(package private) static <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;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</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/atomic/AtomicReference.html?is-external=true" title="class or interface in java.util.concurrent.atomic">AtomicReference</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#metaProvider">metaProvider</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/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionGroupingProvider.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#providerClass">providerClass</a></span></code>&nbsp;</td>
 </tr>
@@ -306,8 +302,7 @@
 <tbody>
 <tr class="altColor">
 <td class="colFirst"><code><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;? extends <a href="../../../../../../org/apache/hadoop/hbase/wal/WALProvider.html" title="interface in org.apache.hadoop.hbase.wal">WALProvider</a>&gt;</code></td>
-<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;clsKey,
-                <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;key,
+<td class="colLast"><span class="typeNameLabel">WALFactory.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;key,
                 <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;defaultValue)</code>&nbsp;</td>
 </tr>
 </tbody>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/overview-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/overview-tree.html b/devapidocs/overview-tree.html
index 37384df..f30f08d 100644
--- a/devapidocs/overview-tree.html
+++ b/devapidocs/overview-tree.html
@@ -2212,7 +2212,6 @@
 <li type="circle">org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/MasterMobCompactionThread.CompactionRunner.html" title="class in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterMobCompactionThread.CompactionRunner</span></a> (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Runnable.html?is-external=true" title="class or interface in java.lang">Runnable</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureConstants</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv</span></a> (implements org.apache.hadoop.hbase.conf.<a href="org/apache/hadoop/hbase/conf/ConfigurationObserver.html" title="interface in org.apache.hadoop.hbase.conf">ConfigurationObserver</a>)</li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.MasterProcedureStoreListener</span></a> (implements org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.WALStoreLeaseRecovery</span></a> (implements org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.LeaseRecovery.html" title="interface in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureStore.LeaseRecovery</a>)</li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureUtil</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureUtil.NonceProcedureRunnable</span></a></li>
@@ -2847,6 +2846,7 @@
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.DefaultRackManager.html" title="class in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.DefaultRackManager</span></a></li>
 </ul>
 </li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Random64</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/RateLimiter.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RateLimiter</span></a>
 <ul>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/AverageIntervalRateLimiter.html" title="class in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">AverageIntervalRateLimiter</span></a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index cf0f796..2187e33 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -18,9 +18,9 @@
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
 <span class="sourceLineNo">011</span>  public static final String revision = "";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Thu Oct 11 14:44:19 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Fri Oct 12 14:44:04 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
-<span class="sourceLineNo">015</span>  public static final String srcChecksum = "9567fbd68d8644485c69dcccfa2a19e0";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "49a2b154bae9102fcee848b07c870bbe";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[49/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 1712d03..43a6894 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -25,8 +25,8 @@ under the License.
     <language>en-us</language>
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
-      <title>File: 3760,
-             Errors: 15158,
+      <title>File: 3762,
+             Errors: 15156,
              Warnings: 0,
              Infos: 0
       </title>
@@ -11479,7 +11479,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  5
+                  4
                 </td>
               </tr>
                           <tr>
@@ -22096,6 +22096,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.util.Random64.java">org/apache/hadoop/hbase/util/Random64.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.metrics.impl.MetricRegistryImpl.java">org/apache/hadoop/hbase/metrics/impl/MetricRegistryImpl.java</a>
                 </td>
                 <td>
@@ -23888,6 +23902,20 @@ under the License.
               </tr>
                           <tr>
                 <td>
+                  <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.procedure2.store.wal.TestForceUpdateProcedure.java">org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java</a>
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+                <td>
+                  0
+                </td>
+              </tr>
+                          <tr>
+                <td>
                   <a href="http://hbase.apache.org/checkstyle.html#org.apache.hadoop.hbase.io.hfile.InlineBlockWriter.java">org/apache/hadoop/hbase/io/hfile/InlineBlockWriter.java</a>
                 </td>
                 <td>
@@ -29147,7 +29175,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  11
+                  10
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 9ad5c4c..ebeaaa0 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index da9e955..bd0e9d2 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index eb83afc..fcc0cba 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -285,10 +285,10 @@
 <td>44</td></tr>
 <tr class="a">
 <th>Number of dependencies (NOD):</th>
-<td>309</td></tr>
+<td>308</td></tr>
 <tr class="b">
 <th>Number of unique artifacts (NOA):</th>
-<td>335</td></tr>
+<td>334</td></tr>
 <tr class="a">
 <th>Number of version-conflicting artifacts (NOC):</th>
 <td>19</td></tr>
@@ -879,7 +879,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 3edb315..c99aa8d 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index 2b9ab1d..2fb131e 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20181011" />
+    <meta name="Date-Revision-yyyymmdd" content="20181012" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -740,55 +740,55 @@
 <tr class="b">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-http</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-io</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-jmx</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-security</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-server</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-servlet</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-util-ajax</a></td>
-<td>9.3.19.v20170502</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">
 <td>org.eclipse.jetty</td>
 <td><a class="externalLink" href="http://www.eclipse.org/jetty">jetty-webapp</a></td>
-<td>9.3.19.v20170502</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">
@@ -977,8 +977,8 @@
 <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">
 <td>org.bouncycastle</td>
-<td><a class="externalLink" href="http://www.bouncycastle.org/java.html">bcprov-jdk16</a></td>
-<td>1.46</td>
+<td><a class="externalLink" href="http://www.bouncycastle.org/java.html">bcprov-jdk15on</a></td>
+<td>1.60</td>
 <td>jar</td>
 <td><a class="externalLink" href="http://www.bouncycastle.org/licence.html">Bouncy Castle Licence</a></td></tr>
 <tr class="a">
@@ -1005,7 +1005,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-11</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-12</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/allclasses-frame.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-frame.html b/devapidocs/allclasses-frame.html
index 1de63fa..480e8e1 100644
--- a/devapidocs/allclasses-frame.html
+++ b/devapidocs/allclasses-frame.html
@@ -1423,7 +1423,6 @@
 <li><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor" target="classFrame"><span class="interfaceName">MasterObserver</span></a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureConstants</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv</a></li>
-<li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv.MasterProcedureStoreListener</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure" target="classFrame">MasterProcedureEnv.WALStoreLeaseRecovery</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure/MasterProcedureManager.html" title="class in org.apache.hadoop.hbase.procedure" target="classFrame">MasterProcedureManager</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure" target="classFrame">MasterProcedureManagerHost</a></li>
@@ -1962,6 +1961,7 @@
 <li><a href="org/apache/hadoop/hbase/quotas/QuotaUtil.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">QuotaUtil</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/QuotaUtil.KeyFromRow.html" title="interface in org.apache.hadoop.hbase.quotas" target="classFrame"><span class="interfaceName">QuotaUtil.KeyFromRow</span></a></li>
 <li><a href="org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master" target="classFrame">RackManager</a></li>
+<li><a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util" target="classFrame">Random64</a></li>
 <li><a href="org/apache/hadoop/hbase/filter/RandomRowFilter.html" title="class in org.apache.hadoop.hbase.filter" target="classFrame">RandomRowFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/RateLimiter.html" title="class in org.apache.hadoop.hbase.quotas" target="classFrame">RateLimiter</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.html" title="class in org.apache.hadoop.hbase.regionserver.compactions" target="classFrame">RatioBasedCompactionPolicy</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/allclasses-noframe.html
----------------------------------------------------------------------
diff --git a/devapidocs/allclasses-noframe.html b/devapidocs/allclasses-noframe.html
index fa863b6..1297096 100644
--- a/devapidocs/allclasses-noframe.html
+++ b/devapidocs/allclasses-noframe.html
@@ -1423,7 +1423,6 @@
 <li><a href="org/apache/hadoop/hbase/coprocessor/MasterObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor"><span class="interfaceName">MasterObserver</span></a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureConstants.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureConstants</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a></li>
-<li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></li>
 <li><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.WALStoreLeaseRecovery</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure/MasterProcedureManager.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManager</a></li>
 <li><a href="org/apache/hadoop/hbase/procedure/MasterProcedureManagerHost.html" title="class in org.apache.hadoop.hbase.procedure">MasterProcedureManagerHost</a></li>
@@ -1962,6 +1961,7 @@
 <li><a href="org/apache/hadoop/hbase/quotas/QuotaUtil.html" title="class in org.apache.hadoop.hbase.quotas">QuotaUtil</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/QuotaUtil.KeyFromRow.html" title="interface in org.apache.hadoop.hbase.quotas"><span class="interfaceName">QuotaUtil.KeyFromRow</span></a></li>
 <li><a href="org/apache/hadoop/hbase/master/RackManager.html" title="class in org.apache.hadoop.hbase.master">RackManager</a></li>
+<li><a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></li>
 <li><a href="org/apache/hadoop/hbase/filter/RandomRowFilter.html" title="class in org.apache.hadoop.hbase.filter">RandomRowFilter</a></li>
 <li><a href="org/apache/hadoop/hbase/quotas/RateLimiter.html" title="class in org.apache.hadoop.hbase.quotas">RateLimiter</a></li>
 <li><a href="org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">RatioBasedCompactionPolicy</a></li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index f18aed8..72229ee 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3824,7 +3824,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>"Thu Oct 11 14:44:19 UTC 2018"</code></td>
+<td class="colLast"><code>"Fri Oct 12 14:44:04 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
@@ -3838,7 +3838,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>"9567fbd68d8644485c69dcccfa2a19e0"</code></td>
+<td class="colLast"><code>"49a2b154bae9102fcee848b07c870bbe"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">
@@ -17179,7 +17179,7 @@
 <!--   -->
 </a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureStore.html#DEFAULT_WAL_COUNT_WARN_THRESHOLD">DEFAULT_WAL_COUNT_WARN_THRESHOLD</a></code></td>
-<td class="colLast"><code>64</code></td>
+<td class="colLast"><code>10</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore.EXEC_WAL_CLEANUP_ON_LOAD_CONF_KEY">
@@ -28536,6 +28536,32 @@
 </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.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</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.util.Random64.addend">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;long</code></td>
+<td><code><a href="org/apache/hadoop/hbase/util/Random64.html#addend">addend</a></code></td>
+<td class="colLast"><code>1442695040888963407L</code></td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.util.Random64.multiplier">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;long</code></td>
+<td><code><a href="org/apache/hadoop/hbase/util/Random64.html#multiplier">multiplier</a></code></td>
+<td class="colLast"><code>6364136223846793005L</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.util.<a href="org/apache/hadoop/hbase/util/RegionMover.html" title="class in org.apache.hadoop.hbase.util">RegionMover</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>
@@ -28980,20 +29006,13 @@
 <td class="colLast"><code>"hbase.wal.regiongrouping.delegate.provider"</code></td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.DELEGATE_PROVIDER_CLASS">
-<!--   -->
-</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/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></code></td>
-<td class="colLast"><code>"hbase.wal.regiongrouping.delegate.provider.class"</code></td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.META_WAL_GROUP_NAME">
 <!--   -->
 </a><code>private&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/wal/RegionGroupingProvider.html#META_WAL_GROUP_NAME">META_WAL_GROUP_NAME</a></code></td>
 <td class="colLast"><code>"meta"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.RegionGroupingProvider.REGION_GROUPING_STRATEGY">
 <!--   -->
 </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>
@@ -29058,26 +29077,12 @@
 <td class="colLast"><code>"hbase.wal.meta_provider"</code></td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.META_WAL_PROVIDER_CLASS">
-<!--   -->
-</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/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></code></td>
-<td class="colLast"><code>"hbase.wal.meta_provider.class"</code></td>
-</tr>
-<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER">
 <!--   -->
 </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/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</a></code></td>
 <td class="colLast"><code>"hbase.wal.provider"</code></td>
 </tr>
-<tr class="rowColor">
-<td class="colFirst"><a name="org.apache.hadoop.hbase.wal.WALFactory.WAL_PROVIDER_CLASS">
-<!--   -->
-</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/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></code></td>
-<td class="colLast"><code>"hbase.wal.provider.class"</code></td>
-</tr>
 </tbody>
 </table>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 2a137a4..dc725a6 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -306,8 +306,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/HBaseAdmin.ProcedureFuture.html#abortProcedureResult-org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProtos.AbortProcedureRequest-">abortProcedureResult(MasterProtos.AbortProcedureRequest)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/HBaseAdmin.ProcedureFuture.html" title="class in org.apache.hadoop.hbase.client">HBaseAdmin.ProcedureFuture</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#abortProcess--">abortProcess()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#abortProcess--">abortProcess()</a></span> - Method in interface org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></dt>
 <dd>
 <div class="block">triggered when the store is not able to write out data.</div>
@@ -1639,6 +1637,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MetaTableAccessor.html#addEmptyLocation-org.apache.hadoop.hbase.client.Put-int-">addEmptyLocation(Put, int)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MetaTableAccessor.html" title="class in org.apache.hadoop.hbase">MetaTableAccessor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#addend">addend</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/http/HttpServer.Builder.html#addEndpoint-java.net.URI-">addEndpoint(URI)</a></span> - Method in class org.apache.hadoop.hbase.http.<a href="org/apache/hadoop/hbase/http/HttpServer.Builder.html" title="class in org.apache.hadoop.hbase.http">HttpServer.Builder</a></dt>
 <dd>
 <div class="block">Add an endpoint that the HTTP server should listen to.</div>
@@ -24008,8 +24008,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER">DEFAULT_WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#DEFAULT_WAL_PROVIDER_CLASS">DEFAULT_WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#DEFAULT_WAL_STORAGE_POLICY">DEFAULT_WAL_STORAGE_POLICY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
 <dd>
 <div class="block">By default we defer the WAL storage policy to HDFS</div>
@@ -24328,8 +24326,6 @@
 <dd>
 <div class="block">delegate provider for WAL creation/roll/close</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html#DELEGATE_PROVIDER_CLASS">DELEGATE_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/RegionGroupingProvider.html" title="class in org.apache.hadoop.hbase.wal">RegionGroupingProvider</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HColumnDescriptor.html#delegatee">delegatee</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HColumnDescriptor.html" title="class in org.apache.hadoop.hbase">HColumnDescriptor</a></dt>
 <dd>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span></div>
@@ -33208,6 +33204,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html#forceSync">forceSync</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/SyncFuture.html" title="class in org.apache.hadoop.hbase.regionserver.wal">SyncFuture</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#forceUpdate-long:A-">forceUpdate(long[])</a></span> - Method in interface org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></dt>
+<dd>
+<div class="block">Suggest that the upper layer should update the state of some procedures.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#forceUpdateExecutor">forceUpdateExecutor</a></span> - Variable in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#forceUpdateProcedure-long-">forceUpdateProcedure(long)</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html#forcible">forcible</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">MergeTableRegionsProcedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/errorhandling/ForeignException.html" title="class in org.apache.hadoop.hbase.errorhandling"><span class="typeNameLink">ForeignException</span></a> - Exception in <a href="org/apache/hadoop/hbase/errorhandling/package-summary.html">org.apache.hadoop.hbase.errorhandling</a></dt>
@@ -34744,6 +34748,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#getActiveProcIds--">getActiveProcIds()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.<a href="org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="class in org.apache.hadoop.hbase.procedure2">ProcedureExecutor</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/BitSetNode.html#getActiveProcIds--">getActiveProcIds()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/BitSetNode.html" title="class in org.apache.hadoop.hbase.procedure2.store">BitSetNode</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/RpcExecutor.html#getActiveReadHandlerCount--">getActiveReadHandlerCount()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/RpcExecutor.html" title="class in org.apache.hadoop.hbase.ipc">RpcExecutor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.html#getActiveReadHandlerCount--">getActiveReadHandlerCount()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.html" title="class in org.apache.hadoop.hbase.ipc">RWQueueRpcExecutor</a></dt>
@@ -34962,6 +34968,10 @@
 <dd>
 <div class="block">Returns a map from table name to table descriptor for all tables.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html#getAllActiveProcIds--">getAllActiveProcIds()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStoreTracker.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreTracker</a></dt>
+<dd>
+<div class="block">Will be used when there are too many proc wal files.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/CoprocessorClassLoader.html#getAllCached--">getAllCached()</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/CoprocessorClassLoader.html" title="class in org.apache.hadoop.hbase.util">CoprocessorClassLoader</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift/ThriftServerRunner.HBaseHandler.html#getAllColumns-org.apache.hadoop.hbase.client.Table-">getAllColumns(Table)</a></span> - Method in class org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/ThriftServerRunner.HBaseHandler.html" title="class in org.apache.hadoop.hbase.thrift">ThriftServerRunner.HBaseHandler</a></dt>
@@ -46279,7 +46289,7 @@
 <dd>
 <div class="block">Return the provider for this Cipher</div>
 </dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-java.lang.String-">getProviderClass(String, String, String)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#getProviderClass-java.lang.String-java.lang.String-">getProviderClass(String, String)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/SaslUtil.html#getQop-java.lang.String-">getQop(String)</a></span> - Static method in class org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/SaslUtil.html" title="class in org.apache.hadoop.hbase.security">SaslUtil</a></dt>
 <dd>
@@ -71112,6 +71122,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/MapreduceDependencyClasspathTool.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/MapreduceDependencyClasspathTool.html" title="class in org.apache.hadoop.hbase.util">MapreduceDependencyClasspathTool</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>
+<div class="block">Random64 is a pseudorandom algorithm(LCG).</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RegionMover.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RegionMover.html" title="class in org.apache.hadoop.hbase.util">RegionMover</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RegionSplitter.html#main-java.lang.String:A-">main(String[])</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RegionSplitter.html" title="class in org.apache.hadoop.hbase.util">RegionSplitter</a></dt>
@@ -71850,8 +71864,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#master">master</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#master">master</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html#master">master</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.WALStoreLeaseRecovery</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html#master">master</a></span> - Variable in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.NonceProcedureRunnable.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureUtil.NonceProcedureRunnable</a></dt>
@@ -72177,8 +72189,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html#MasterProcedureEnv-org.apache.hadoop.hbase.master.MasterServices-org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher-">MasterProcedureEnv(MasterServices, RSProcedureDispatcher)</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv</a></dt>
 <dd>&nbsp;</dd>
-<dt><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.MasterProcedureStoreListener</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.WALStoreLeaseRecovery.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureEnv.WALStoreLeaseRecovery</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/procedure/MasterProcedureManager.html" title="class in org.apache.hadoop.hbase.procedure"><span class="typeNameLink">MasterProcedureManager</span></a> - Class in <a href="org/apache/hadoop/hbase/procedure/package-summary.html">org.apache.hadoop.hbase.procedure</a></dt>
@@ -72200,8 +72210,6 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html#MasterProcedureScheduler--">MasterProcedureScheduler()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureScheduler.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureScheduler</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#MasterProcedureStoreListener-org.apache.hadoop.hbase.master.MasterServices-">MasterProcedureStoreListener(MasterServices)</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></dt>
-<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MasterProcedureUtil</span></a> - Class in <a href="org/apache/hadoop/hbase/master/procedure/package-summary.html">org.apache.hadoop.hbase.master.procedure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html#MasterProcedureUtil--">MasterProcedureUtil()</a></span> - Constructor for class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureUtil.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureUtil</a></dt>
@@ -73883,8 +73891,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER">META_WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#META_WAL_PROVIDER_CLASS">META_WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/AbstractFSWALProvider.html#META_WAL_PROVIDER_ID">META_WAL_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>
 <div class="block">The hbase:meta region's WAL filename extension</div>
@@ -76546,6 +76552,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html#multiplier">multiplier</a></span> - Variable in class org.apache.hadoop.hbase.master.balancer.<a href="org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.CostFunction.html" title="class in org.apache.hadoop.hbase.master.balancer">StochasticLoadBalancer.CostFunction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#multiplier">multiplier</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/coprocessor/BigDecimalColumnInterpreter.html#multiply-java.math.BigDecimal-java.math.BigDecimal-">multiply(BigDecimal, BigDecimal)</a></span> - Method in class org.apache.hadoop.hbase.client.coprocessor.<a href="org/apache/hadoop/hbase/client/coprocessor/BigDecimalColumnInterpreter.html" title="class in org.apache.hadoop.hbase.client.coprocessor">BigDecimalColumnInterpreter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/coprocessor/DoubleColumnInterpreter.html#multiply-java.lang.Double-java.lang.Double-">multiply(Double, Double)</a></span> - Method in class org.apache.hadoop.hbase.client.coprocessor.<a href="org/apache/hadoop/hbase/client/coprocessor/DoubleColumnInterpreter.html" title="class in org.apache.hadoop.hbase.client.coprocessor">DoubleColumnInterpreter</a></dt>
@@ -78078,6 +78086,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WAL.Reader.html#next-org.apache.hadoop.hbase.wal.WAL.Entry-">next(WAL.Entry)</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WAL.Reader.html" title="interface in org.apache.hadoop.hbase.wal">WAL.Reader</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#next64-int-">next64(int)</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html#NEXT_BIT_MASK">NEXT_BIT_MASK</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html" title="class in org.apache.hadoop.hbase.util">ByteBufferUtils</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html#NEXT_BIT_SHIFT">NEXT_BIT_SHIFT</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ByteBufferUtils.html" title="class in org.apache.hadoop.hbase.util">ByteBufferUtils</a></dt>
@@ -78097,6 +78107,8 @@
 <div class="block">Similar to <a href="org/apache/hadoop/hbase/io/hfile/HFileBlock.BlockIterator.html#nextBlock--"><code>HFileBlock.BlockIterator.nextBlock()</code></a> but checks block type, throws an
  exception if incorrect, and returns the HFile block</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#nextBytes-byte:A-">nextBytes(byte[])</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/AbstractRpcClient.html#nextCallId--">nextCallId()</a></span> - Method in class org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/AbstractRpcClient.html" title="class in org.apache.hadoop.hbase.ipc">AbstractRpcClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.html#nextCallSeq">nextCallSeq</a></span> - Variable in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.html" title="class in org.apache.hadoop.hbase.client">AsyncScanSingleRegionRpcRetryingCaller</a></dt>
@@ -78163,6 +78175,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/encoding/RowIndexSeekerV1.SeekerState.html#nextKvOffset">nextKvOffset</a></span> - Variable in class org.apache.hadoop.hbase.io.encoding.<a href="org/apache/hadoop/hbase/io/encoding/RowIndexSeekerV1.SeekerState.html" title="class in org.apache.hadoop.hbase.io.encoding">RowIndexSeekerV1.SeekerState</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#nextLong--">nextLong()</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html#nextPacketOffsetInBlock">nextPacketOffsetInBlock</a></span> - Variable in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html#nextPacketSeqno">nextPacketSeqno</a></span> - Variable in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutput.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutput</a></dt>
@@ -83933,8 +83947,6 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#postStoreFileReaderOpen-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen(FileSystem, Path, FSDataInputStreamWrapper, long, CacheConfig, Reference, StoreFileReader)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html#postSync--">postSync()</a></span> - Method in class org.apache.hadoop.hbase.master.procedure.<a href="org/apache/hadoop/hbase/master/procedure/MasterProcedureEnv.MasterProcedureStoreListener.html" title="class in org.apache.hadoop.hbase.master.procedure">MasterProcedureEnv.MasterProcedureStoreListener</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html#postSync--">postSync()</a></span> - Method in interface org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureStoreListener.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureStoreListener</a></dt>
 <dd>
 <div class="block">triggered when the store sync is completed.</div>
@@ -88468,6 +88480,15 @@ service.</div>
 <dd>
 <div class="block">Fill given array with random bytes at the specified position.</div>
 </dd>
+<dt><a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util"><span class="typeNameLink">Random64</span></a> - Class in <a href="org/apache/hadoop/hbase/util/package-summary.html">org.apache.hadoop.hbase.util</a></dt>
+<dd>
+<div class="block">An instance of this class is used to generate a stream of
+ pseudorandom numbers.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#Random64--">Random64()</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#Random64-long-">Random64(long)</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.html#RANDOM_RADIX">RANDOM_RADIX</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.html" title="class in org.apache.hadoop.hbase.regionserver">SecureBulkLoadManager</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.html#RANDOM_WIDTH">RANDOM_WIDTH</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/SecureBulkLoadManager.html" title="class in org.apache.hadoop.hbase.regionserver">SecureBulkLoadManager</a></dt>
@@ -99510,6 +99531,14 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/SecurityUtil.html#SecurityUtil--">SecurityUtil()</a></span> - Constructor for class org.apache.hadoop.hbase.security.<a href="org/apache/hadoop/hbase/security/SecurityUtil.html" title="class in org.apache.hadoop.hbase.security">SecurityUtil</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#seed">seed</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#seedUniquifier">seedUniquifier</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/Random64.html#seedUniquifier--">seedUniquifier()</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/Random64.html" title="class in org.apache.hadoop.hbase.util">Random64</a></dt>
+<dd>
+<div class="block">Copy from <a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true#seedUniquifier--" title="class or interface in java.util"><code>Random.seedUniquifier()</code></a></div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html#seek-long-">seek(long)</a></span> - Method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/FileLink.FileLinkInputStream.html" title="class in org.apache.hadoop.hbase.io">FileLink.FileLinkInputStream</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/WALInputFormat.WALRecordReader.html#seek--">seek()</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/WALInputFormat.WALRecordReader.html" title="class in org.apache.hadoop.hbase.mapreduce">WALInputFormat.WALRecordReader</a></dt>
@@ -99843,6 +99872,8 @@ service.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/filter/RestCsrfPreventionFilter.ServletFilterHttpInteraction.html#sendError-int-java.lang.String-">sendError(int, String)</a></span> - Method in class org.apache.hadoop.hbase.rest.filter.<a href="org/apache/hadoop/hbase/rest/filter/RestCsrfPreventionFilter.ServletFilterHttpInteraction.html" title="class in org.apache.hadoop.hbase.rest.filter">RestCsrfPreventionFilter.ServletFilterHttpInteraction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html#sendForceUpdateSignal-long:A-">sendForceUpdateSignal(long[])</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStoreBase.html" title="class in org.apache.hadoop.hbase.procedure2.store">ProcedureStoreBase</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.html#sendGlobalBarrierAcquire-org.apache.hadoop.hbase.procedure.Procedure-byte:A-java.util.List-">sendGlobalBarrierAcquire(Procedure, byte[], List&lt;String&gt;)</a></span> - Method in interface org.apache.hadoop.hbase.procedure.<a href="org/apache/hadoop/hbase/procedure/ProcedureCoordinatorRpcs.html" title="interface in org.apache.hadoop.hbase.procedure">ProcedureCoordinatorRpcs</a></dt>
 <dd>
 <div class="block">Notify the members to acquire barrier for the procedure</div>
@@ -122426,6 +122457,10 @@ the order they are declared.</div>
 <dd>
 <div class="block">Waits until the entire procedure has globally completed, or has been aborted.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/JVMClusterUtil.html#waitForEvent-long-java.lang.String-java.util.function.Supplier-">waitForEvent(long, String, Supplier&lt;Boolean&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/JVMClusterUtil.html" title="class in org.apache.hadoop.hbase.util">JVMClusterUtil</a></dt>
+<dd>
+<div class="block">Utility method to wait some time for an event to occur, and then return control to the caller.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HRegion.html#waitForFlushes--">waitForFlushes()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a></dt>
 <dd>
 <div class="block">Wait for all current flushes of the region to complete</div>
@@ -122916,8 +122951,6 @@ the order they are declared.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER">WAL_PROVIDER</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALFactory.html#WAL_PROVIDER_CLASS">WAL_PROVIDER_CLASS</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALFactory.html" title="class in org.apache.hadoop.hbase.wal">WALFactory</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/HConstants.html#WAL_STORAGE_POLICY">WAL_STORAGE_POLICY</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/HConstants.html" title="class in org.apache.hadoop.hbase">HConstants</a></dt>
 <dd>
 <div class="block">Configuration name of WAL storage policy

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index c4b3203..d0d625a 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -168,9 +168,9 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index c0aed51..f747fa4 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -555,24 +555,24 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<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/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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.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/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/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/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/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/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index 329f62f..e67b778 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -201,8 +201,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index ce950b0..ae0124e 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index 2a7563b..266431c 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,14 +183,14 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/CompareFilter.CompareOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">CompareFilter.CompareOp</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
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 f2b79c5..b7188fa 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -274,12 +274,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" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/Cacheable.MemoryType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">Cacheable.MemoryType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/CacheConfig.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">CacheConfig.ExternalBlockCaches</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.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/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 7557e4f..91a2ed4 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,8 +353,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 626507e..f930505 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -294,8 +294,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" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/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/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 </ul>
 </li>


[13/51] [partial] hbase-site git commit: Published site at fa5fa6ecdd071b72b58971058ff3ab9d28c3e709.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d1341859/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.WalProps.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.WalProps.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.WalProps.html
index f1a6dfa..e0f7285 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.WalProps.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.WalProps.html
@@ -416,735 +416,730 @@
 <span class="sourceLineNo">408</span>    this.blocksize = WALUtil.getWALBlockSize(this.conf, this.fs, this.walDir);<a name="line.408"></a>
 <span class="sourceLineNo">409</span>    float multiplier = conf.getFloat("hbase.regionserver.logroll.multiplier", 0.5f);<a name="line.409"></a>
 <span class="sourceLineNo">410</span>    this.logrollsize = (long)(this.blocksize * multiplier);<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>    boolean maxLogsDefined = conf.get("hbase.regionserver.maxlogs") != null;<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    if (maxLogsDefined) {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      LOG.warn("'hbase.regionserver.maxlogs' was deprecated.");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    }<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    this.maxLogs = conf.getInt("hbase.regionserver.maxlogs",<a name="line.416"></a>
-<span class="sourceLineNo">417</span>      Math.max(32, calculateMaxLogFiles(conf, logrollsize)));<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    LOG.info("WAL configuration: blocksize=" + StringUtils.byteDesc(blocksize) + ", rollsize=" +<a name="line.419"></a>
-<span class="sourceLineNo">420</span>      StringUtils.byteDesc(this.logrollsize) + ", prefix=" + this.walFilePrefix + ", suffix=" +<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      walFileSuffix + ", logDir=" + this.walDir + ", archiveDir=" + this.walArchiveDir);<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    this.slowSyncNs = TimeUnit.MILLISECONDS<a name="line.422"></a>
-<span class="sourceLineNo">423</span>        .toNanos(conf.getInt("hbase.regionserver.hlog.slowsync.ms", DEFAULT_SLOW_SYNC_TIME_MS));<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    this.walSyncTimeoutNs = TimeUnit.MILLISECONDS<a name="line.424"></a>
-<span class="sourceLineNo">425</span>        .toNanos(conf.getLong("hbase.regionserver.hlog.sync.timeout", DEFAULT_WAL_SYNC_TIMEOUT_MS));<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    this.cachedSyncFutures = new ThreadLocal&lt;SyncFuture&gt;() {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      protected SyncFuture initialValue() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>        return new SyncFuture();<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>    this.implClassName = getClass().getSimpleName();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>  }<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>   * Used to initialize the WAL. Usually just call rollWriter to create the first log writer.<a name="line.436"></a>
-<span class="sourceLineNo">437</span>   */<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  public void init() throws IOException {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    rollWriter();<a name="line.439"></a>
+<span class="sourceLineNo">411</span>    this.maxLogs = conf.getInt("hbase.regionserver.maxlogs",<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      Math.max(32, calculateMaxLogFiles(conf, logrollsize)));<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    LOG.info("WAL configuration: blocksize=" + StringUtils.byteDesc(blocksize) + ", rollsize=" +<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      StringUtils.byteDesc(this.logrollsize) + ", prefix=" + this.walFilePrefix + ", suffix=" +<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      walFileSuffix + ", logDir=" + this.walDir + ", archiveDir=" + this.walArchiveDir);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    this.slowSyncNs = TimeUnit.MILLISECONDS<a name="line.417"></a>
+<span class="sourceLineNo">418</span>        .toNanos(conf.getInt("hbase.regionserver.hlog.slowsync.ms", DEFAULT_SLOW_SYNC_TIME_MS));<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    this.walSyncTimeoutNs = TimeUnit.MILLISECONDS<a name="line.419"></a>
+<span class="sourceLineNo">420</span>        .toNanos(conf.getLong("hbase.regionserver.hlog.sync.timeout", DEFAULT_WAL_SYNC_TIMEOUT_MS));<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    this.cachedSyncFutures = new ThreadLocal&lt;SyncFuture&gt;() {<a name="line.421"></a>
+<span class="sourceLineNo">422</span>      @Override<a name="line.422"></a>
+<span class="sourceLineNo">423</span>      protected SyncFuture initialValue() {<a name="line.423"></a>
+<span class="sourceLineNo">424</span>        return new SyncFuture();<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>    this.implClassName = getClass().getSimpleName();<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  }<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>   * Used to initialize the WAL. Usually just call rollWriter to create the first log writer.<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   */<a name="line.432"></a>
+<span class="sourceLineNo">433</span>  public void init() throws IOException {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    rollWriter();<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>  @Override<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  public void registerWALActionsListener(WALActionsListener listener) {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    this.listeners.add(listener);<a name="line.439"></a>
 <span class="sourceLineNo">440</span>  }<a name="line.440"></a>
 <span class="sourceLineNo">441</span><a name="line.441"></a>
 <span class="sourceLineNo">442</span>  @Override<a name="line.442"></a>
-<span class="sourceLineNo">443</span>  public void registerWALActionsListener(WALActionsListener listener) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    this.listeners.add(listener);<a name="line.444"></a>
+<span class="sourceLineNo">443</span>  public boolean unregisterWALActionsListener(WALActionsListener listener) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>    return this.listeners.remove(listener);<a name="line.444"></a>
 <span class="sourceLineNo">445</span>  }<a name="line.445"></a>
 <span class="sourceLineNo">446</span><a name="line.446"></a>
 <span class="sourceLineNo">447</span>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public boolean unregisterWALActionsListener(WALActionsListener listener) {<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    return this.listeners.remove(listener);<a name="line.449"></a>
+<span class="sourceLineNo">448</span>  public WALCoprocessorHost getCoprocessorHost() {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    return coprocessorHost;<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>  @Override<a name="line.452"></a>
-<span class="sourceLineNo">453</span>  public WALCoprocessorHost getCoprocessorHost() {<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    return coprocessorHost;<a name="line.454"></a>
+<span class="sourceLineNo">453</span>  public Long startCacheFlush(byte[] encodedRegionName, Set&lt;byte[]&gt; families) {<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, families);<a name="line.454"></a>
 <span class="sourceLineNo">455</span>  }<a name="line.455"></a>
 <span class="sourceLineNo">456</span><a name="line.456"></a>
 <span class="sourceLineNo">457</span>  @Override<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  public Long startCacheFlush(byte[] encodedRegionName, Set&lt;byte[]&gt; families) {<a name="line.458"></a>
-<span class="sourceLineNo">459</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, families);<a name="line.459"></a>
+<span class="sourceLineNo">458</span>  public Long startCacheFlush(byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq) {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, familyToSeq);<a name="line.459"></a>
 <span class="sourceLineNo">460</span>  }<a name="line.460"></a>
 <span class="sourceLineNo">461</span><a name="line.461"></a>
 <span class="sourceLineNo">462</span>  @Override<a name="line.462"></a>
-<span class="sourceLineNo">463</span>  public Long startCacheFlush(byte[] encodedRegionName, Map&lt;byte[], Long&gt; familyToSeq) {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return this.sequenceIdAccounting.startCacheFlush(encodedRegionName, familyToSeq);<a name="line.464"></a>
+<span class="sourceLineNo">463</span>  public void completeCacheFlush(byte[] encodedRegionName) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    this.sequenceIdAccounting.completeCacheFlush(encodedRegionName);<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>  public void completeCacheFlush(byte[] encodedRegionName) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    this.sequenceIdAccounting.completeCacheFlush(encodedRegionName);<a name="line.469"></a>
+<span class="sourceLineNo">468</span>  public void abortCacheFlush(byte[] encodedRegionName) {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    this.sequenceIdAccounting.abortCacheFlush(encodedRegionName);<a name="line.469"></a>
 <span class="sourceLineNo">470</span>  }<a name="line.470"></a>
 <span class="sourceLineNo">471</span><a name="line.471"></a>
 <span class="sourceLineNo">472</span>  @Override<a name="line.472"></a>
-<span class="sourceLineNo">473</span>  public void abortCacheFlush(byte[] encodedRegionName) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    this.sequenceIdAccounting.abortCacheFlush(encodedRegionName);<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  }<a name="line.475"></a>
-<span class="sourceLineNo">476</span><a name="line.476"></a>
-<span class="sourceLineNo">477</span>  @Override<a name="line.477"></a>
-<span class="sourceLineNo">478</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName) {<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    // Used by tests. Deprecated as too subtle for general usage.<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName);<a name="line.480"></a>
-<span class="sourceLineNo">481</span>  }<a name="line.481"></a>
-<span class="sourceLineNo">482</span><a name="line.482"></a>
-<span class="sourceLineNo">483</span>  @Override<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    // This method is used by tests and for figuring if we should flush or not because our<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // sequenceids are too old. It is also used reporting the master our oldest sequenceid for use<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    // figuring what edits can be skipped during log recovery. getEarliestMemStoreSequenceId<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    // from this.sequenceIdAccounting is looking first in flushingOldestStoreSequenceIds, the<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // currently flushing sequence ids, and if anything found there, it is returning these. This is<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    // the right thing to do for the reporting oldest sequenceids to master; we won't skip edits if<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    // we crash during the flush. For figuring what to flush, we might get requeued if our sequence<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    // id is old even though we are currently flushing. This may mean we do too much flushing.<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName, familyName);<a name="line.493"></a>
+<span class="sourceLineNo">473</span>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName) {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    // Used by tests. Deprecated as too subtle for general usage.<a name="line.474"></a>
+<span class="sourceLineNo">475</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName);<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>  public long getEarliestMemStoreSeqNum(byte[] encodedRegionName, byte[] familyName) {<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    // This method is used by tests and for figuring if we should flush or not because our<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    // sequenceids are too old. It is also used reporting the master our oldest sequenceid for use<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    // figuring what edits can be skipped during log recovery. getEarliestMemStoreSequenceId<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    // from this.sequenceIdAccounting is looking first in flushingOldestStoreSequenceIds, the<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    // currently flushing sequence ids, and if anything found there, it is returning these. This is<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    // the right thing to do for the reporting oldest sequenceids to master; we won't skip edits if<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    // we crash during the flush. For figuring what to flush, we might get requeued if our sequence<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    // id is old even though we are currently flushing. This may mean we do too much flushing.<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return this.sequenceIdAccounting.getLowestSequenceId(encodedRegionName, familyName);<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>  public byte[][] rollWriter() throws FailedLogCloseException, IOException {<a name="line.492"></a>
+<span class="sourceLineNo">493</span>    return rollWriter(false);<a name="line.493"></a>
 <span class="sourceLineNo">494</span>  }<a name="line.494"></a>
 <span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>  @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  public byte[][] rollWriter() throws FailedLogCloseException, IOException {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return rollWriter(false);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>  /**<a name="line.501"></a>
-<span class="sourceLineNo">502</span>   * This is a convenience method that computes a new filename with a given file-number.<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @param filenum to use<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   * @return Path<a name="line.504"></a>
-<span class="sourceLineNo">505</span>   */<a name="line.505"></a>
-<span class="sourceLineNo">506</span>  protected Path computeFilename(final long filenum) {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    if (filenum &lt; 0) {<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      throw new RuntimeException("WAL file number can't be &lt; 0");<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    String child = walFilePrefix + WAL_FILE_NAME_DELIMITER + filenum + walFileSuffix;<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return new Path(walDir, child);<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  }<a name="line.512"></a>
-<span class="sourceLineNo">513</span><a name="line.513"></a>
-<span class="sourceLineNo">514</span>  /**<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * This is a convenience method that computes a new filename with a given using the current WAL<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * file-number<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return Path<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getCurrentFileName() {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    return computeFilename(this.filenum.get());<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>   * retrieve the next path to use for writing. Increments the internal filenum.<a name="line.524"></a>
-<span class="sourceLineNo">525</span>   */<a name="line.525"></a>
-<span class="sourceLineNo">526</span>  private Path getNewPath() throws IOException {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    this.filenum.set(System.currentTimeMillis());<a name="line.527"></a>
-<span class="sourceLineNo">528</span>    Path newPath = getCurrentFileName();<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    while (fs.exists(newPath)) {<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      this.filenum.incrementAndGet();<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      newPath = getCurrentFileName();<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    }<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    return newPath;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  }<a name="line.534"></a>
-<span class="sourceLineNo">535</span><a name="line.535"></a>
-<span class="sourceLineNo">536</span>  @VisibleForTesting<a name="line.536"></a>
-<span class="sourceLineNo">537</span>  Path getOldPath() {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    long currentFilenum = this.filenum.get();<a name="line.538"></a>
-<span class="sourceLineNo">539</span>    Path oldPath = null;<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    if (currentFilenum &gt; 0) {<a name="line.540"></a>
-<span class="sourceLineNo">541</span>      // ComputeFilename will take care of meta wal filename<a name="line.541"></a>
-<span class="sourceLineNo">542</span>      oldPath = computeFilename(currentFilenum);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    } // I presume if currentFilenum is &lt;= 0, this is first file and null for oldPath if fine?<a name="line.543"></a>
-<span class="sourceLineNo">544</span>    return oldPath;<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  }<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>   * Tell listeners about pre log roll.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private void tellListenersAboutPreLogRoll(final Path oldPath, final Path newPath)<a name="line.550"></a>
-<span class="sourceLineNo">551</span>      throws IOException {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    coprocessorHost.preWALRoll(oldPath, newPath);<a name="line.552"></a>
-<span class="sourceLineNo">553</span><a name="line.553"></a>
-<span class="sourceLineNo">554</span>    if (!this.listeners.isEmpty()) {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      for (WALActionsListener i : this.listeners) {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>        i.preLogRoll(oldPath, newPath);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      }<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>  }<a name="line.559"></a>
-<span class="sourceLineNo">560</span><a name="line.560"></a>
-<span class="sourceLineNo">561</span>  /**<a name="line.561"></a>
-<span class="sourceLineNo">562</span>   * Tell listeners about post log roll.<a name="line.562"></a>
-<span class="sourceLineNo">563</span>   */<a name="line.563"></a>
-<span class="sourceLineNo">564</span>  private void tellListenersAboutPostLogRoll(final Path oldPath, final Path newPath)<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      throws IOException {<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (!this.listeners.isEmpty()) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      for (WALActionsListener i : this.listeners) {<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        i.postLogRoll(oldPath, newPath);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      }<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    coprocessorHost.postWALRoll(oldPath, newPath);<a name="line.572"></a>
-<span class="sourceLineNo">573</span>  }<a name="line.573"></a>
-<span class="sourceLineNo">574</span><a name="line.574"></a>
-<span class="sourceLineNo">575</span>  // public only until class moves to o.a.h.h.wal<a name="line.575"></a>
-<span class="sourceLineNo">576</span>  /** @return the number of rolled log files */<a name="line.576"></a>
-<span class="sourceLineNo">577</span>  public int getNumRolledLogFiles() {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    return walFile2Props.size();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  }<a name="line.579"></a>
-<span class="sourceLineNo">580</span><a name="line.580"></a>
-<span class="sourceLineNo">581</span>  // public only until class moves to o.a.h.h.wal<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  /** @return the number of log files in use */<a name="line.582"></a>
-<span class="sourceLineNo">583</span>  public int getNumLogFiles() {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    // +1 for current use log<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    return getNumRolledLogFiles() + 1;<a name="line.585"></a>
-<span class="sourceLineNo">586</span>  }<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>  /**<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * If the number of un-archived WAL files is greater than maximum allowed, check the first<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   * (oldest) WAL file, and returns those regions which should be flushed so that it can be<a name="line.590"></a>
-<span class="sourceLineNo">591</span>   * archived.<a name="line.591"></a>
-<span class="sourceLineNo">592</span>   * @return regions (encodedRegionNames) to flush in order to archive oldest WAL file.<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   */<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  byte[][] findRegionsToForceFlush() throws IOException {<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    byte[][] regions = null;<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    int logCount = getNumRolledLogFiles();<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    if (logCount &gt; this.maxLogs &amp;&amp; logCount &gt; 0) {<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      Map.Entry&lt;Path, WalProps&gt; firstWALEntry = this.walFile2Props.firstEntry();<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      regions =<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        this.sequenceIdAccounting.findLower(firstWALEntry.getValue().encodedName2HighestSequenceId);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    if (regions != null) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      StringBuilder sb = new StringBuilder();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      for (int i = 0; i &lt; regions.length; i++) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>        if (i &gt; 0) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>          sb.append(", ");<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>        sb.append(Bytes.toStringBinary(regions[i]));<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      }<a name="line.609"></a>
-<span class="sourceLineNo">610</span>      LOG.info("Too many WALs; count=" + logCount + ", max=" + this.maxLogs +<a name="line.610"></a>
-<span class="sourceLineNo">611</span>        "; forcing flush of " + regions.length + " regions(s): " + sb.toString());<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    return regions;<a name="line.613"></a>
-<span class="sourceLineNo">614</span>  }<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>  /**<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   * Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>   */<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  private void cleanOldLogs() throws IOException {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    List&lt;Pair&lt;Path, Long&gt;&gt; logsToArchive = null;<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    // For each log file, look at its Map of regions to highest sequence id; if all sequence ids<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    // are older than what is currently in memory, the WAL can be GC'd.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    for (Map.Entry&lt;Path, WalProps&gt; e : this.walFile2Props.entrySet()) {<a name="line.623"></a>
-<span class="sourceLineNo">624</span>      Path log = e.getKey();<a name="line.624"></a>
-<span class="sourceLineNo">625</span>      Map&lt;byte[], Long&gt; sequenceNums = e.getValue().encodedName2HighestSequenceId;<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      if (this.sequenceIdAccounting.areAllLower(sequenceNums)) {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>        if (logsToArchive == null) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>          logsToArchive = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        logsToArchive.add(Pair.newPair(log, e.getValue().logSize));<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        if (LOG.isTraceEnabled()) {<a name="line.631"></a>
-<span class="sourceLineNo">632</span>          LOG.trace("WAL file ready for archiving " + log);<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        }<a name="line.633"></a>
-<span class="sourceLineNo">634</span>      }<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    }<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    if (logsToArchive != null) {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>      for (Pair&lt;Path, Long&gt; logAndSize : logsToArchive) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        this.totalLogSize.addAndGet(-logAndSize.getSecond());<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        archiveLogFile(logAndSize.getFirst());<a name="line.639"></a>
-<span class="sourceLineNo">640</span>        this.walFile2Props.remove(logAndSize.getFirst());<a name="line.640"></a>
-<span class="sourceLineNo">641</span>      }<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    }<a name="line.642"></a>
-<span class="sourceLineNo">643</span>  }<a name="line.643"></a>
-<span class="sourceLineNo">644</span><a name="line.644"></a>
-<span class="sourceLineNo">645</span>  /*<a name="line.645"></a>
-<span class="sourceLineNo">646</span>   * only public so WALSplitter can use.<a name="line.646"></a>
-<span class="sourceLineNo">647</span>   * @return archived location of a WAL file with the given path p<a name="line.647"></a>
-<span class="sourceLineNo">648</span>   */<a name="line.648"></a>
-<span class="sourceLineNo">649</span>  public static Path getWALArchivePath(Path archiveDir, Path p) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    return new Path(archiveDir, p.getName());<a name="line.650"></a>
-<span class="sourceLineNo">651</span>  }<a name="line.651"></a>
-<span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>  private void archiveLogFile(final Path p) throws IOException {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    Path newPath = getWALArchivePath(this.walArchiveDir, p);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    // Tell our listeners that a log is going to be archived.<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    if (!this.listeners.isEmpty()) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      for (WALActionsListener i : this.listeners) {<a name="line.657"></a>
-<span class="sourceLineNo">658</span>        i.preLogArchive(p, newPath);<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      }<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    }<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    LOG.info("Archiving " + p + " to " + newPath);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    if (!CommonFSUtils.renameAndSetModifyTime(this.fs, p, newPath)) {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>      throw new IOException("Unable to rename " + p + " to " + newPath);<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    }<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    // Tell our listeners that a log has been archived.<a name="line.665"></a>
-<span class="sourceLineNo">666</span>    if (!this.listeners.isEmpty()) {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>      for (WALActionsListener i : this.listeners) {<a name="line.667"></a>
-<span class="sourceLineNo">668</span>        i.postLogArchive(p, newPath);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>      }<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    }<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  }<a name="line.671"></a>
-<span class="sourceLineNo">672</span><a name="line.672"></a>
-<span class="sourceLineNo">673</span>  protected final void logRollAndSetupWalProps(Path oldPath, Path newPath, long oldFileLen) {<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    int oldNumEntries = this.numEntries.getAndSet(0);<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    String newPathString = newPath != null ? CommonFSUtils.getPath(newPath) : null;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    if (oldPath != null) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>      this.walFile2Props.put(oldPath,<a name="line.677"></a>
-<span class="sourceLineNo">678</span>        new WalProps(this.sequenceIdAccounting.resetHighest(), oldFileLen));<a name="line.678"></a>
-<span class="sourceLineNo">679</span>      this.totalLogSize.addAndGet(oldFileLen);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>      LOG.info("Rolled WAL {} with entries={}, filesize={}; new WAL {}",<a name="line.680"></a>
-<span class="sourceLineNo">681</span>        CommonFSUtils.getPath(oldPath), oldNumEntries, StringUtils.byteDesc(oldFileLen),<a name="line.681"></a>
-<span class="sourceLineNo">682</span>        newPathString);<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    } else {<a name="line.683"></a>
-<span class="sourceLineNo">684</span>      LOG.info("New WAL {}", newPathString);<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    }<a name="line.685"></a>
-<span class="sourceLineNo">686</span>  }<a name="line.686"></a>
-<span class="sourceLineNo">687</span><a name="line.687"></a>
-<span class="sourceLineNo">688</span>  /**<a name="line.688"></a>
-<span class="sourceLineNo">689</span>   * &lt;p&gt;<a name="line.689"></a>
-<span class="sourceLineNo">690</span>   * Cleans up current writer closing it and then puts in place the passed in<a name="line.690"></a>
-<span class="sourceLineNo">691</span>   * &lt;code&gt;nextWriter&lt;/code&gt;.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>   * &lt;/p&gt;<a name="line.692"></a>
-<span class="sourceLineNo">693</span>   * &lt;p&gt;<a name="line.693"></a>
-<span class="sourceLineNo">694</span>   * &lt;ul&gt;<a name="line.694"></a>
-<span class="sourceLineNo">695</span>   * &lt;li&gt;In the case of creating a new WAL, oldPath will be null.&lt;/li&gt;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>   * &lt;li&gt;In the case of rolling over from one file to the next, none of the parameters will be null.<a name="line.696"></a>
-<span class="sourceLineNo">697</span>   * &lt;/li&gt;<a name="line.697"></a>
-<span class="sourceLineNo">698</span>   * &lt;li&gt;In the case of closing out this FSHLog with no further use newPath and nextWriter will be<a name="line.698"></a>
-<span class="sourceLineNo">699</span>   * null.&lt;/li&gt;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>   * &lt;/ul&gt;<a name="line.700"></a>
-<span class="sourceLineNo">701</span>   * &lt;/p&gt;<a name="line.701"></a>
-<span class="sourceLineNo">702</span>   * @param oldPath may be null<a name="line.702"></a>
-<span class="sourceLineNo">703</span>   * @param newPath may be null<a name="line.703"></a>
-<span class="sourceLineNo">704</span>   * @param nextWriter may be null<a name="line.704"></a>
-<span class="sourceLineNo">705</span>   * @return the passed in &lt;code&gt;newPath&lt;/code&gt;<a name="line.705"></a>
-<span class="sourceLineNo">706</span>   * @throws IOException if there is a problem flushing or closing the underlying FS<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   */<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  @VisibleForTesting<a name="line.708"></a>
-<span class="sourceLineNo">709</span>  Path replaceWriter(Path oldPath, Path newPath, W nextWriter) throws IOException {<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    try (TraceScope scope = TraceUtil.createTrace("FSHFile.replaceWriter")) {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      doReplaceWriter(oldPath, newPath, nextWriter);<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      return newPath;<a name="line.712"></a>
-<span class="sourceLineNo">713</span>    }<a name="line.713"></a>
-<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
-<span class="sourceLineNo">715</span><a name="line.715"></a>
-<span class="sourceLineNo">716</span>  protected final void blockOnSync(SyncFuture syncFuture) throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    // Now we have published the ringbuffer, halt the current thread until we get an answer back.<a name="line.717"></a>
-<span class="sourceLineNo">718</span>    try {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      if (syncFuture != null) {<a name="line.719"></a>
-<span class="sourceLineNo">720</span>        if (closed) {<a name="line.720"></a>
-<span class="sourceLineNo">721</span>          throw new IOException("WAL has been closed");<a name="line.721"></a>
-<span class="sourceLineNo">722</span>        } else {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>          syncFuture.get(walSyncTimeoutNs);<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        }<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      }<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    } catch (TimeoutIOException tioe) {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      // SyncFuture reuse by thread, if TimeoutIOException happens, ringbuffer<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      // still refer to it, so if this thread use it next time may get a wrong<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      // result.<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.cachedSyncFutures.remove();<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      throw tioe;<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    } catch (InterruptedException ie) {<a name="line.732"></a>
-<span class="sourceLineNo">733</span>      LOG.warn("Interrupted", ie);<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      throw convertInterruptedExceptionToIOException(ie);<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    } catch (ExecutionException e) {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>      throw ensureIOException(e.getCause());<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    }<a name="line.737"></a>
-<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
-<span class="sourceLineNo">739</span><a name="line.739"></a>
-<span class="sourceLineNo">740</span>  private static IOException ensureIOException(final Throwable t) {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    return (t instanceof IOException) ? (IOException) t : new IOException(t);<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
-<span class="sourceLineNo">743</span><a name="line.743"></a>
-<span class="sourceLineNo">744</span>  private IOException convertInterruptedExceptionToIOException(final InterruptedException ie) {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>    Thread.currentThread().interrupt();<a name="line.745"></a>
-<span class="sourceLineNo">746</span>    IOException ioe = new InterruptedIOException();<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    ioe.initCause(ie);<a name="line.747"></a>
-<span class="sourceLineNo">748</span>    return ioe;<a name="line.748"></a>
-<span class="sourceLineNo">749</span>  }<a name="line.749"></a>
-<span class="sourceLineNo">750</span><a name="line.750"></a>
-<span class="sourceLineNo">751</span>  @Override<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  public byte[][] rollWriter(boolean force) throws FailedLogCloseException, IOException {<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    rollWriterLock.lock();<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    try {<a name="line.754"></a>
-<span class="sourceLineNo">755</span>      if (this.closed) {<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        throw new WALClosedException("WAL has been closed");<a name="line.756"></a>
-<span class="sourceLineNo">757</span>      }<a name="line.757"></a>
-<span class="sourceLineNo">758</span>      // Return if nothing to flush.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>      if (!force &amp;&amp; this.writer != null &amp;&amp; this.numEntries.get() &lt;= 0) {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>        return null;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>      }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      byte[][] regionsToFlush = null;<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      try (TraceScope scope = TraceUtil.createTrace("FSHLog.rollWriter")) {<a name="line.763"></a>
-<span class="sourceLineNo">764</span>        Path oldPath = getOldPath();<a name="line.764"></a>
-<span class="sourceLineNo">765</span>        Path newPath = getNewPath();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>        // Any exception from here on is catastrophic, non-recoverable so we currently abort.<a name="line.766"></a>
-<span class="sourceLineNo">767</span>        W nextWriter = this.createWriterInstance(newPath);<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        tellListenersAboutPreLogRoll(oldPath, newPath);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>        // NewPath could be equal to oldPath if replaceWriter fails.<a name="line.769"></a>
-<span class="sourceLineNo">770</span>        newPath = replaceWriter(oldPath, newPath, nextWriter);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>        tellListenersAboutPostLogRoll(oldPath, newPath);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>        if (LOG.isDebugEnabled()) {<a name="line.772"></a>
-<span class="sourceLineNo">773</span>          LOG.debug("Create new " + implClassName + " writer with pipeline: " +<a name="line.773"></a>
-<span class="sourceLineNo">774</span>            Arrays.toString(getPipeline()));<a name="line.774"></a>
+<span class="sourceLineNo">496</span>  /**<a name="line.496"></a>
+<span class="sourceLineNo">497</span>   * This is a convenience method that computes a new filename with a given file-number.<a name="line.497"></a>
+<span class="sourceLineNo">498</span>   * @param filenum to use<a name="line.498"></a>
+<span class="sourceLineNo">499</span>   * @return Path<a name="line.499"></a>
+<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  protected Path computeFilename(final long filenum) {<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    if (filenum &lt; 0) {<a name="line.502"></a>
+<span class="sourceLineNo">503</span>      throw new RuntimeException("WAL file number can't be &lt; 0");<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    }<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    String child = walFilePrefix + WAL_FILE_NAME_DELIMITER + filenum + walFileSuffix;<a name="line.505"></a>
+<span class="sourceLineNo">506</span>    return new Path(walDir, child);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  }<a name="line.507"></a>
+<span class="sourceLineNo">508</span><a name="line.508"></a>
+<span class="sourceLineNo">509</span>  /**<a name="line.509"></a>
+<span class="sourceLineNo">510</span>   * This is a convenience method that computes a new filename with a given using the current WAL<a name="line.510"></a>
+<span class="sourceLineNo">511</span>   * file-number<a name="line.511"></a>
+<span class="sourceLineNo">512</span>   * @return Path<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   */<a name="line.513"></a>
+<span class="sourceLineNo">514</span>  public Path getCurrentFileName() {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    return computeFilename(this.filenum.get());<a name="line.515"></a>
+<span class="sourceLineNo">516</span>  }<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>   * retrieve the next path to use for writing. Increments the internal filenum.<a name="line.519"></a>
+<span class="sourceLineNo">520</span>   */<a name="line.520"></a>
+<span class="sourceLineNo">521</span>  private Path getNewPath() throws IOException {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    this.filenum.set(System.currentTimeMillis());<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    Path newPath = getCurrentFileName();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    while (fs.exists(newPath)) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      this.filenum.incrementAndGet();<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      newPath = getCurrentFileName();<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    }<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    return newPath;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>  @VisibleForTesting<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  Path getOldPath() {<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    long currentFilenum = this.filenum.get();<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    Path oldPath = null;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    if (currentFilenum &gt; 0) {<a name="line.535"></a>
+<span class="sourceLineNo">536</span>      // ComputeFilename will take care of meta wal filename<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      oldPath = computeFilename(currentFilenum);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    } // I presume if currentFilenum is &lt;= 0, this is first file and null for oldPath if fine?<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    return oldPath;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<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>   * Tell listeners about pre log roll.<a name="line.543"></a>
+<span class="sourceLineNo">544</span>   */<a name="line.544"></a>
+<span class="sourceLineNo">545</span>  private void tellListenersAboutPreLogRoll(final Path oldPath, final Path newPath)<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      throws IOException {<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    coprocessorHost.preWALRoll(oldPath, newPath);<a name="line.547"></a>
+<span class="sourceLineNo">548</span><a name="line.548"></a>
+<span class="sourceLineNo">549</span>    if (!this.listeners.isEmpty()) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>      for (WALActionsListener i : this.listeners) {<a name="line.550"></a>
+<span class="sourceLineNo">551</span>        i.preLogRoll(oldPath, newPath);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      }<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    }<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
+<span class="sourceLineNo">555</span><a name="line.555"></a>
+<span class="sourceLineNo">556</span>  /**<a name="line.556"></a>
+<span class="sourceLineNo">557</span>   * Tell listeners about post log roll.<a name="line.557"></a>
+<span class="sourceLineNo">558</span>   */<a name="line.558"></a>
+<span class="sourceLineNo">559</span>  private void tellListenersAboutPostLogRoll(final Path oldPath, final Path newPath)<a name="line.559"></a>
+<span class="sourceLineNo">560</span>      throws IOException {<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    if (!this.listeners.isEmpty()) {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      for (WALActionsListener i : this.listeners) {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        i.postLogRoll(oldPath, newPath);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      }<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span><a name="line.566"></a>
+<span class="sourceLineNo">567</span>    coprocessorHost.postWALRoll(oldPath, newPath);<a name="line.567"></a>
+<span class="sourceLineNo">568</span>  }<a name="line.568"></a>
+<span class="sourceLineNo">569</span><a name="line.569"></a>
+<span class="sourceLineNo">570</span>  // public only until class moves to o.a.h.h.wal<a name="line.570"></a>
+<span class="sourceLineNo">571</span>  /** @return the number of rolled log files */<a name="line.571"></a>
+<span class="sourceLineNo">572</span>  public int getNumRolledLogFiles() {<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    return walFile2Props.size();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>  }<a name="line.574"></a>
+<span class="sourceLineNo">575</span><a name="line.575"></a>
+<span class="sourceLineNo">576</span>  // public only until class moves to o.a.h.h.wal<a name="line.576"></a>
+<span class="sourceLineNo">577</span>  /** @return the number of log files in use */<a name="line.577"></a>
+<span class="sourceLineNo">578</span>  public int getNumLogFiles() {<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    // +1 for current use log<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    return getNumRolledLogFiles() + 1;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>  }<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>  /**<a name="line.583"></a>
+<span class="sourceLineNo">584</span>   * If the number of un-archived WAL files is greater than maximum allowed, check the first<a name="line.584"></a>
+<span class="sourceLineNo">585</span>   * (oldest) WAL file, and returns those regions which should be flushed so that it can be<a name="line.585"></a>
+<span class="sourceLineNo">586</span>   * archived.<a name="line.586"></a>
+<span class="sourceLineNo">587</span>   * @return regions (encodedRegionNames) to flush in order to archive oldest WAL file.<a name="line.587"></a>
+<span class="sourceLineNo">588</span>   */<a name="line.588"></a>
+<span class="sourceLineNo">589</span>  byte[][] findRegionsToForceFlush() throws IOException {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    byte[][] regions = null;<a name="line.590"></a>
+<span class="sourceLineNo">591</span>    int logCount = getNumRolledLogFiles();<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    if (logCount &gt; this.maxLogs &amp;&amp; logCount &gt; 0) {<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      Map.Entry&lt;Path, WalProps&gt; firstWALEntry = this.walFile2Props.firstEntry();<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      regions =<a name="line.594"></a>
+<span class="sourceLineNo">595</span>        this.sequenceIdAccounting.findLower(firstWALEntry.getValue().encodedName2HighestSequenceId);<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    }<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    if (regions != null) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      StringBuilder sb = new StringBuilder();<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      for (int i = 0; i &lt; regions.length; i++) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        if (i &gt; 0) {<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          sb.append(", ");<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        }<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        sb.append(Bytes.toStringBinary(regions[i]));<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      }<a name="line.604"></a>
+<span class="sourceLineNo">605</span>      LOG.info("Too many WALs; count=" + logCount + ", max=" + this.maxLogs +<a name="line.605"></a>
+<span class="sourceLineNo">606</span>        "; forcing flush of " + regions.length + " regions(s): " + sb.toString());<a name="line.606"></a>
+<span class="sourceLineNo">607</span>    }<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    return regions;<a name="line.608"></a>
+<span class="sourceLineNo">609</span>  }<a name="line.609"></a>
+<span class="sourceLineNo">610</span><a name="line.610"></a>
+<span class="sourceLineNo">611</span>  /**<a name="line.611"></a>
+<span class="sourceLineNo">612</span>   * Archive old logs. A WAL is eligible for archiving if all its WALEdits have been flushed.<a name="line.612"></a>
+<span class="sourceLineNo">613</span>   */<a name="line.613"></a>
+<span class="sourceLineNo">614</span>  private void cleanOldLogs() throws IOException {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    List&lt;Pair&lt;Path, Long&gt;&gt; logsToArchive = null;<a name="line.615"></a>
+<span class="sourceLineNo">616</span>    // For each log file, look at its Map of regions to highest sequence id; if all sequence ids<a name="line.616"></a>
+<span class="sourceLineNo">617</span>    // are older than what is currently in memory, the WAL can be GC'd.<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    for (Map.Entry&lt;Path, WalProps&gt; e : this.walFile2Props.entrySet()) {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>      Path log = e.getKey();<a name="line.619"></a>
+<span class="sourceLineNo">620</span>      Map&lt;byte[], Long&gt; sequenceNums = e.getValue().encodedName2HighestSequenceId;<a name="line.620"></a>
+<span class="sourceLineNo">621</span>      if (this.sequenceIdAccounting.areAllLower(sequenceNums)) {<a name="line.621"></a>
+<span class="sourceLineNo">622</span>        if (logsToArchive == null) {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>          logsToArchive = new ArrayList&lt;&gt;();<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        }<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        logsToArchive.add(Pair.newPair(log, e.getValue().logSize));<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        if (LOG.isTraceEnabled()) {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>          LOG.trace("WAL file ready for archiving " + log);<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        }<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      }<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    }<a name="line.630"></a>
+<span class="sourceLineNo">631</span>    if (logsToArchive != null) {<a name="line.631"></a>
+<span class="sourceLineNo">632</span>      for (Pair&lt;Path, Long&gt; logAndSize : logsToArchive) {<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        this.totalLogSize.addAndGet(-logAndSize.getSecond());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        archiveLogFile(logAndSize.getFirst());<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        this.walFile2Props.remove(logAndSize.getFirst());<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      }<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    }<a name="line.637"></a>
+<span class="sourceLineNo">638</span>  }<a name="line.638"></a>
+<span class="sourceLineNo">639</span><a name="line.639"></a>
+<span class="sourceLineNo">640</span>  /*<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * only public so WALSplitter can use.<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   * @return archived location of a WAL file with the given path p<a name="line.642"></a>
+<span class="sourceLineNo">643</span>   */<a name="line.643"></a>
+<span class="sourceLineNo">644</span>  public static Path getWALArchivePath(Path archiveDir, Path p) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    return new Path(archiveDir, p.getName());<a name="line.645"></a>
+<span class="sourceLineNo">646</span>  }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>  private void archiveLogFile(final Path p) throws IOException {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    Path newPath = getWALArchivePath(this.walArchiveDir, p);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    // Tell our listeners that a log is going to be archived.<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    if (!this.listeners.isEmpty()) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      for (WALActionsListener i : this.listeners) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        i.preLogArchive(p, newPath);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    LOG.info("Archiving " + p + " to " + newPath);<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    if (!CommonFSUtils.renameAndSetModifyTime(this.fs, p, newPath)) {<a name="line.657"></a>
+<span class="sourceLineNo">658</span>      throw new IOException("Unable to rename " + p + " to " + newPath);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>    }<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    // Tell our listeners that a log has been archived.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    if (!this.listeners.isEmpty()) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      for (WALActionsListener i : this.listeners) {<a name="line.662"></a>
+<span class="sourceLineNo">663</span>        i.postLogArchive(p, newPath);<a name="line.663"></a>
+<span class="sourceLineNo">664</span>      }<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    }<a name="line.665"></a>
+<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>  protected final void logRollAndSetupWalProps(Path oldPath, Path newPath, long oldFileLen) {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    int oldNumEntries = this.numEntries.getAndSet(0);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    String newPathString = newPath != null ? CommonFSUtils.getPath(newPath) : null;<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    if (oldPath != null) {<a name="line.671"></a>
+<span class="sourceLineNo">672</span>      this.walFile2Props.put(oldPath,<a name="line.672"></a>
+<span class="sourceLineNo">673</span>        new WalProps(this.sequenceIdAccounting.resetHighest(), oldFileLen));<a name="line.673"></a>
+<span class="sourceLineNo">674</span>      this.totalLogSize.addAndGet(oldFileLen);<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      LOG.info("Rolled WAL {} with entries={}, filesize={}; new WAL {}",<a name="line.675"></a>
+<span class="sourceLineNo">676</span>        CommonFSUtils.getPath(oldPath), oldNumEntries, StringUtils.byteDesc(oldFileLen),<a name="line.676"></a>
+<span class="sourceLineNo">677</span>        newPathString);<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    } else {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      LOG.info("New WAL {}", newPathString);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>  }<a name="line.681"></a>
+<span class="sourceLineNo">682</span><a name="line.682"></a>
+<span class="sourceLineNo">683</span>  /**<a name="line.683"></a>
+<span class="sourceLineNo">684</span>   * &lt;p&gt;<a name="line.684"></a>
+<span class="sourceLineNo">685</span>   * Cleans up current writer closing it and then puts in place the passed in<a name="line.685"></a>
+<span class="sourceLineNo">686</span>   * &lt;code&gt;nextWriter&lt;/code&gt;.<a name="line.686"></a>
+<span class="sourceLineNo">687</span>   * &lt;/p&gt;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>   * &lt;p&gt;<a name="line.688"></a>
+<span class="sourceLineNo">689</span>   * &lt;ul&gt;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>   * &lt;li&gt;In the case of creating a new WAL, oldPath will be null.&lt;/li&gt;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>   * &lt;li&gt;In the case of rolling over from one file to the next, none of the parameters will be null.<a name="line.691"></a>
+<span class="sourceLineNo">692</span>   * &lt;/li&gt;<a name="line.692"></a>
+<span class="sourceLineNo">693</span>   * &lt;li&gt;In the case of closing out this FSHLog with no further use newPath and nextWriter will be<a name="line.693"></a>
+<span class="sourceLineNo">694</span>   * null.&lt;/li&gt;<a name="line.694"></a>
+<span class="sourceLineNo">695</span>   * &lt;/ul&gt;<a name="line.695"></a>
+<span class="sourceLineNo">696</span>   * &lt;/p&gt;<a name="line.696"></a>
+<span class="sourceLineNo">697</span>   * @param oldPath may be null<a name="line.697"></a>
+<span class="sourceLineNo">698</span>   * @param newPath may be null<a name="line.698"></a>
+<span class="sourceLineNo">699</span>   * @param nextWriter may be null<a name="line.699"></a>
+<span class="sourceLineNo">700</span>   * @return the passed in &lt;code&gt;newPath&lt;/code&gt;<a name="line.700"></a>
+<span class="sourceLineNo">701</span>   * @throws IOException if there is a problem flushing or closing the underlying FS<a name="line.701"></a>
+<span class="sourceLineNo">702</span>   */<a name="line.702"></a>
+<span class="sourceLineNo">703</span>  @VisibleForTesting<a name="line.703"></a>
+<span class="sourceLineNo">704</span>  Path replaceWriter(Path oldPath, Path newPath, W nextWriter) throws IOException {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    try (TraceScope scope = TraceUtil.createTrace("FSHFile.replaceWriter")) {<a name="line.705"></a>
+<span class="sourceLineNo">706</span>      doReplaceWriter(oldPath, newPath, nextWriter);<a name="line.706"></a>
+<span class="sourceLineNo">707</span>      return newPath;<a name="line.707"></a>
+<span class="sourceLineNo">708</span>    }<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  }<a name="line.709"></a>
+<span class="sourceLineNo">710</span><a name="line.710"></a>
+<span class="sourceLineNo">711</span>  protected final void blockOnSync(SyncFuture syncFuture) throws IOException {<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    // Now we have published the ringbuffer, halt the current thread until we get an answer back.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    try {<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      if (syncFuture != null) {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>        if (closed) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>          throw new IOException("WAL has been closed");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        } else {<a name="line.717"></a>
+<span class="sourceLineNo">718</span>          syncFuture.get(walSyncTimeoutNs);<a name="line.718"></a>
+<span class="sourceLineNo">719</span>        }<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      }<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    } catch (TimeoutIOException tioe) {<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      // SyncFuture reuse by thread, if TimeoutIOException happens, ringbuffer<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      // still refer to it, so if this thread use it next time may get a wrong<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      // result.<a name="line.724"></a>
+<span class="sourceLineNo">725</span>      this.cachedSyncFutures.remove();<a name="line.725"></a>
+<span class="sourceLineNo">726</span>      throw tioe;<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    } catch (InterruptedException ie) {<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      LOG.warn("Interrupted", ie);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>      throw convertInterruptedExceptionToIOException(ie);<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    } catch (ExecutionException e) {<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      throw ensureIOException(e.getCause());<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
+<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
+<span class="sourceLineNo">734</span><a name="line.734"></a>
+<span class="sourceLineNo">735</span>  private static IOException ensureIOException(final Throwable t) {<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    return (t instanceof IOException) ? (IOException) t : new IOException(t);<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  }<a name="line.737"></a>
+<span class="sourceLineNo">738</span><a name="line.738"></a>
+<span class="sourceLineNo">739</span>  private IOException convertInterruptedExceptionToIOException(final InterruptedException ie) {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    Thread.currentThread().interrupt();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    IOException ioe = new InterruptedIOException();<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    ioe.initCause(ie);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    return ioe;<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  }<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>  @Override<a name="line.746"></a>
+<span class="sourceLineNo">747</span>  public byte[][] rollWriter(boolean force) throws FailedLogCloseException, IOException {<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    rollWriterLock.lock();<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    try {<a name="line.749"></a>
+<span class="sourceLineNo">750</span>      if (this.closed) {<a name="line.750"></a>
+<span class="sourceLineNo">751</span>        throw new WALClosedException("WAL has been closed");<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      }<a name="line.752"></a>
+<span class="sourceLineNo">753</span>      // Return if nothing to flush.<a name="line.753"></a>
+<span class="sourceLineNo">754</span>      if (!force &amp;&amp; this.writer != null &amp;&amp; this.numEntries.get() &lt;= 0) {<a name="line.754"></a>
+<span class="sourceLineNo">755</span>        return null;<a name="line.755"></a>
+<span class="sourceLineNo">756</span>      }<a name="line.756"></a>
+<span class="sourceLineNo">757</span>      byte[][] regionsToFlush = null;<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      try (TraceScope scope = TraceUtil.createTrace("FSHLog.rollWriter")) {<a name="line.758"></a>
+<span class="sourceLineNo">759</span>        Path oldPath = getOldPath();<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        Path newPath = getNewPath();<a name="line.760"></a>
+<span class="sourceLineNo">761</span>        // Any exception from here on is catastrophic, non-recoverable so we currently abort.<a name="line.761"></a>
+<span class="sourceLineNo">762</span>        W nextWriter = this.createWriterInstance(newPath);<a name="line.762"></a>
+<span class="sourceLineNo">763</span>        tellListenersAboutPreLogRoll(oldPath, newPath);<a name="line.763"></a>
+<span class="sourceLineNo">764</span>        // NewPath could be equal to oldPath if replaceWriter fails.<a name="line.764"></a>
+<span class="sourceLineNo">765</span>        newPath = replaceWriter(oldPath, newPath, nextWriter);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>        tellListenersAboutPostLogRoll(oldPath, newPath);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>        if (LOG.isDebugEnabled()) {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>          LOG.debug("Create new " + implClassName + " writer with pipeline: " +<a name="line.768"></a>
+<span class="sourceLineNo">769</span>            Arrays.toString(getPipeline()));<a name="line.769"></a>
+<span class="sourceLineNo">770</span>        }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>        // Can we delete any of the old log files?<a name="line.771"></a>
+<span class="sourceLineNo">772</span>        if (getNumRolledLogFiles() &gt; 0) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>          cleanOldLogs();<a name="line.773"></a>
+<span class="sourceLineNo">774</span>          regionsToFlush = findRegionsToForceFlush();<a name="line.774"></a>
 <span class="sourceLineNo">775</span>        }<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        // Can we delete any of the old log files?<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (getNumRolledLogFiles() &gt; 0) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          cleanOldLogs();<a name="line.778"></a>
-<span class="sourceLineNo">779</span>          regionsToFlush = findRegionsToForceFlush();<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        }<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        // If the underlying FileSystem can't do what we ask, treat as IO failure so<a name="line.782"></a>
-<span class="sourceLineNo">783</span>        // we'll abort.<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        throw new IOException(<a name="line.784"></a>
-<span class="sourceLineNo">785</span>            "Underlying FileSystem can't meet stream requirements. See RS log " + "for details.",<a name="line.785"></a>
-<span class="sourceLineNo">786</span>            exception);<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      }<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      return regionsToFlush;<a name="line.788"></a>
-<span class="sourceLineNo">789</span>    } finally {<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      rollWriterLock.unlock();<a name="line.790"></a>
-<span class="sourceLineNo">791</span>    }<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  }<a name="line.792"></a>
-<span class="sourceLineNo">793</span><a name="line.793"></a>
-<span class="sourceLineNo">794</span>  // public only until class moves to o.a.h.h.wal<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  /** @return the size of log files in use */<a name="line.795"></a>
-<span class="sourceLineNo">796</span>  public long getLogFileSize() {<a name="line.796"></a>
-<span class="sourceLineNo">797</span>    return this.totalLogSize.get();<a name="line.797"></a>
+<span class="sourceLineNo">776</span>      } catch (CommonFSUtils.StreamLacksCapabilityException exception) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        // If the underlying FileSystem can't do what we ask, treat as IO failure so<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        // we'll abort.<a name="line.778"></a>
+<span class="sourceLineNo">779</span>        throw new IOException(<a name="line.779"></a>
+<span class="sourceLineNo">780</span>            "Underlying FileSystem can't meet stream requirements. See RS log " + "for details.",<a name="line.780"></a>
+<span class="sourceLineNo">781</span>            exception);<a name="line.781"></a>
+<span class="sourceLineNo">782</span>      }<a name="line.782"></a>
+<span class="sourceLineNo">783</span>      return regionsToFlush;<a name="line.783"></a>
+<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>      rollWriterLock.unlock();<a name="line.785"></a>
+<span class="sourceLineNo">786</span>    }<a name="line.786"></a>
+<span class="sourceLineNo">787</span>  }<a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>  // public only until class moves to o.a.h.h.wal<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  /** @return the size of log files in use */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public long getLogFileSize() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return this.totalLogSize.get();<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  }<a name="line.793"></a>
+<span class="sourceLineNo">794</span><a name="line.794"></a>
+<span class="sourceLineNo">795</span>  // public only until class moves to o.a.h.h.wal<a name="line.795"></a>
+<span class="sourceLineNo">796</span>  public void requestLogRoll() {<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    requestLogRoll(false);<a name="line.797"></a>
 <span class="sourceLineNo">798</span>  }<a name="line.798"></a>
 <span class="sourceLineNo">799</span><a name="line.799"></a>
-<span class="sourceLineNo">800</span>  // public only until class moves to o.a.h.h.wal<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  public void requestLogRoll() {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>    requestLogRoll(false);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
-<span class="sourceLineNo">804</span><a name="line.804"></a>
-<span class="sourceLineNo">805</span>  /**<a name="line.805"></a>
-<span class="sourceLineNo">806</span>   * Get the backing files associated with this WAL.<a name="line.806"></a>
-<span class="sourceLineNo">807</span>   * @return may be null if there are no files.<a name="line.807"></a>
-<span class="sourceLineNo">808</span>   */<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  @VisibleForTesting<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  FileStatus[] getFiles() throws IOException {<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    return CommonFSUtils.listStatus(fs, walDir, ourFiles);<a name="line.811"></a>
-<span class="sourceLineNo">812</span>  }<a name="line.812"></a>
-<span class="sourceLineNo">813</span><a name="line.813"></a>
-<span class="sourceLineNo">814</span>  @Override<a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public void shutdown() throws IOException {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    if (!shutdown.compareAndSet(false, true)) {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>      return;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>    }<a name="line.818"></a>
-<span class="sourceLineNo">819</span>    closed = true;<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    // Tell our listeners that the log is closing<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    if (!this.listeners.isEmpty()) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>      for (WALActionsListener i : this.listeners) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>        i.logCloseRequested();<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      }<a name="line.824"></a>
-<span class="sourceLineNo">825</span>    }<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    rollWriterLock.lock();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>    try {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>      doShutdown();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>    } finally {<a name="line.829"></a>
-<span class="sourceLineNo">830</span>      rollWriterLock.unlock();<a name="line.830"></a>
-<span class="sourceLineNo">831</span>    }<a name="line.831"></a>
-<span class="sourceLineNo">832</span>  }<a name="line.832"></a>
-<span class="sourceLineNo">833</span><a name="line.833"></a>
-<span class="sourceLineNo">834</span>  @Override<a name="line.834"></a>
-<span class="sourceLineNo">835</span>  public void close() throws IOException {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    shutdown();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>    final FileStatus[] files = getFiles();<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    if (null != files &amp;&amp; 0 != files.length) {<a name="line.838"></a>
-<span class="sourceLineNo">839</span>      for (FileStatus file : files) {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>        Path p = getWALArchivePath(this.walArchiveDir, file.getPath());<a name="line.840"></a>
-<span class="sourceLineNo">841</span>        // Tell our listeners that a log is going to be archived.<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        if (!this.listeners.isEmpty()) {<a name="line.842"></a>
-<span class="sourceLineNo">843</span>          for (WALActionsListener i : this.listeners) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>            i.preLogArchive(file.getPath(), p);<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          }<a name="line.845"></a>
-<span class="sourceLineNo">846</span>        }<a name="line.846"></a>
-<span class="sourceLineNo">847</span><a name="line.847"></a>
-<span class="sourceLineNo">848</span>        if (!CommonFSUtils.renameAndSetModifyTime(fs, file.getPath(), p)) {<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          throw new IOException("Unable to rename " + file.getPath() + " to " + p);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>        }<a name="line.850"></a>
-<span class="sourceLineNo">851</span>        // Tell our listeners that a log was archived.<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        if (!this.listeners.isEmpty()) {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          for (WALActionsListener i : this.listeners) {<a name="line.853"></a>
-<span class="sourceLineNo">854</span>            i.postLogArchive(file.getPath(), p);<a name="line.854"></a>
-<span class="sourceLineNo">855</span>          }<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>      }<a name="line.857"></a>
-<span class="sourceLineNo">858</span>      LOG.debug(<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        "Moved " + files.length + " WAL file(s) to " + CommonFSUtils.getPath(this.walArchiveDir));<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    }<a name="line.860"></a>
-<span class="sourceLineNo">861</span>    LOG.info("Closed WAL: " + toString());<a name="line.861"></a>
-<span class="sourceLineNo">862</span>  }<a name="line.862"></a>
-<span class="sourceLineNo">863</span><a name="line.863"></a>
-<span class="sourceLineNo">864</span>  /**<a name="line.864"></a>
-<span class="sourceLineNo">865</span>   * updates the sequence number of a specific store. depending on the flag: replaces current seq<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * number if the given seq id is bigger, or even if it is lower than existing one<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * @param encodedRegionName<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * @param familyName<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * @param sequenceid<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * @param onlyIfGreater<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   */<a name="line.871"></a>
-<span class="sourceLineNo">872</span>  @Override<a name="line.872"></a>
-<span class="sourceLineNo">873</span>  public void updateStore(byte[] encodedRegionName, byte[] familyName, Long sequenceid,<a name="line.873"></a>
-<span class="sourceLineNo">874</span>      boolean onlyIfGreater) {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>    sequenceIdAccounting.updateStore(encodedRegionName, familyName, sequenceid, onlyIfGreater);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  }<a name="line.876"></a>
-<span class="sourceLineNo">877</span><a name="line.877"></a>
-<span class="sourceLineNo">878</span>  protected final SyncFuture getSyncFuture(long sequence) {<a name="line.878"></a>
-<span class="sourceLineNo">879</span>    return cachedSyncFutures.get().reset(sequence);<a name="line.879"></a>
-<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
-<span class="sourceLineNo">881</span><a name="line.881"></a>
-<span class="sourceLineNo">882</span>  protected final void requestLogRoll(boolean tooFewReplicas) {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    if (!this.listeners.isEmpty()) {<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      for (WALActionsListener i : this.listeners) {<a name="line.884"></a>
-<span class="sourceLineNo">885</span>        i.logRollRequested(tooFewReplicas);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      }<a name="line.886"></a>
-<span class="sourceLineNo">887</span>    }<a name="line.887"></a>
-<span class="sourceLineNo">888</span>  }<a name="line.888"></a>
-<span class="sourceLineNo">889</span><a name="line.889"></a>
-<span class="sourceLineNo">890</span>  long getUnflushedEntriesCount() {<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    long highestSynced = this.highestSyncedTxid.get();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    long highestUnsynced = this.highestUnsyncedTxid;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>    return highestSynced &gt;= highestUnsynced ? 0 : highestUnsynced - highestSynced;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>  }<a name="line.894"></a>
-<span class="sourceLineNo">895</span><a name="line.895"></a>
-<span class="sourceLineNo">896</span>  boolean isUnflushedEntries() {<a name="line.896"></a>
-<span class="sourceLineNo">897</span>    return getUnflushedEntriesCount() &gt; 0;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>  }<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>  /**<a name="line.900"></a>
-<span class="sourceLineNo">901</span>   * Exposed for testing only. Use to tricks like halt the ring buffer appending.<a name="line.901"></a>
-<span class="sourceLineNo">902</span>   */<a name="line.902"></a>
-<span class="sourceLineNo">903</span>  @VisibleForTesting<a name="line.903"></a>
-<span class="sourceLineNo">904</span>  void atHeadOfRingBufferEventHandlerAppend() {<a name="line.904"></a>
-<span class="sourceLineNo">905</span>    // Noop<a name="line.905"></a>
-<span class="sourceLineNo">906</span>  }<a name="line.906"></a>
-<span class="sourceLineNo">907</span><a name="line.907"></a>
-<span class="sourceLineNo">908</span>  protected final boolean append(W writer, FSWALEntry entry) throws IOException {<a name="line.908"></a>
-<span class="sourceLineNo">909</span>    // TODO: WORK ON MAKING THIS APPEND FASTER. DOING WAY TOO MUCH WORK WITH CPs, PBing, etc.<a name="line.909"></a>
-<span class="sourceLineNo">910</span>    atHeadOfRingBufferEventHandlerAppend();<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    long start = EnvironmentEdgeManager.currentTime();<a name="line.911"></a>
-<span class="sourceLineNo">912</span>    byte[] encodedRegionName = entry.getKey().getEncodedRegionName();<a name="line.912"></a>
-<span class="sourceLineNo">913</span>    long regionSequenceId = entry.getKey().getSequenceId();<a name="line.913"></a>
-<span class="sourceLineNo">914</span><a name="line.914"></a>
-<span class="sourceLineNo">915</span>    // Edits are empty, there is nothing to append. Maybe empty when we are looking for a<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    // region sequence id only, a region edit/sequence id that is not associated with an actual<a name="line.916"></a>
-<span class="sourceLineNo">917</span>    // edit. It has to go through all the rigmarole to be sure we have the right ordering.<a name="line.917"></a>
-<span class="sourceLineNo">918</span>    if (entry.getEdit().isEmpty()) {<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      return false;<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    }<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    // Coprocessor hook.<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    coprocessorHost.preWALWrite(entry.getRegionInfo(), entry.getKey(), entry.getEdit());<a name="line.923"></a>
-<span class="sourceLineNo">924</span>    if (!listeners.isEmpty()) {<a name="line.924"></a>
-<span class="sourceLineNo">925</span>      for (WALActionsListener i : listeners) {<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        i.visitLogEntryBeforeWrite(entry.getKey(), entry.getEdit());<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      }<a name="line.927"></a>
-<span class="sourceLineNo">928</span>    }<a name="line.928"></a>
-<span class="sourceLineNo">929</span>    doAppend(writer, entry);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>    assert highestUnsyncedTxid &lt; entry.getTxid();<a name="line.930"></a>
-<span class="sourceLineNo">931</span>    highestUnsyncedTxid = entry.getTxid();<a name="line.931"></a>
-<span class="sourceLineNo">932</span>    sequenceIdAccounting.update(encodedRegionName, entry.getFamilyNames(), regionSequenceId,<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      entry.isInMemStore());<a name="line.933"></a>
-<span class="sourceLineNo">934</span>    coprocessorHost.postWALWrite(entry.getRegionInfo(), entry.getKey(), entry.getEdit());<a name="line.934"></a>
-<span class="sourceLineNo">935</span>    // Update metrics.<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    postAppend(entry, EnvironmentEdgeManager.currentTime() - start);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>    numEntries.incrementAndGet();<a name="line.937"></a>
-<span class="sourceLineNo">938</span>    return true;<a name="line.938"></a>
-<span class="sourceLineNo">939</span>  }<a name="line.939"></a>
-<span class="sourceLineNo">940</span><a name="line.940"></a>
-<span class="sourceLineNo">941</span>  private long postAppend(final Entry e, final long elapsedTime) throws IOException {<a name="line.941"></a>
-<span class="sourceLineNo">942</span>    long len = 0;<a name="line.942"></a>
-<span class="sourceLineNo">943</span>    if (!listeners.isEmpty()) {<a name="line.943"></a>
-<span class="sourceLineNo">944</span>      for (Cell cell : e.getEdit().getCells()) {<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        len += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.945"></a>
-<span cla

<TRUNCATED>