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/22 14:53:39 UTC

[01/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 39b82c864 -> 6b8b907fe


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
index 0c87f49..e276e13 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
@@ -518,91 +518,96 @@
 <span class="sourceLineNo">510</span>      // Sometimes there are other procedures still executing (including asynchronously spawned by<a name="line.510"></a>
 <span class="sourceLineNo">511</span>      // procId) and due to KillAndToggleBeforeStoreUpdate flag ProcedureExecutor is stopped before<a name="line.511"></a>
 <span class="sourceLineNo">512</span>      // store update. Let all pending procedures finish normally.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (!procExec.isRunning()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due to"<a name="line.514"></a>
-<span class="sourceLineNo">515</span>            + " KillAndToggleBeforeStoreUpdate flag.");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        restartMasterProcedureExecutor(procExec);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(true, procExec.isRunning());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * is restarted and an abort() is injected.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void testRollbackRetriableFailure(<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      final int lastStep) throws Exception {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // Execute up to last step<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    // execute the rollback<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    testRestartWithAbort(procExec, procId);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(true, procExec.isRunning());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /**<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      long procId) throws Exception {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    abortListener.addProcId(procId);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    procExec.registerListener(abortListener);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      restartMasterProcedureExecutor(procExec);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      assertTrue(procExec.unregisterListener(abortListener));<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>  public static class InjectAbortOnLoadListener<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.570"></a>
+<span class="sourceLineNo">513</span>      ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      // check 3 times to confirm that the procedure executor has not been killed<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      for (int i = 0; i &lt; 3; i++) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (!procExec.isRunning()) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due" +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            " to KillAndToggleBeforeStoreUpdate flag.");<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          restartMasterProcedureExecutor(procExec);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          break;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        Thread.sleep(1000);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    assertEquals(true, procExec.isRunning());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>  /**<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   * is restarted and an abort() is injected.<a name="line.533"></a>
+<span class="sourceLineNo">534</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  public static void testRollbackRetriableFailure(<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      final int lastStep) throws Exception {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    // Execute up to last step<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // execute the rollback<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    testRestartWithAbort(procExec, procId);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>    assertEquals(true, procExec.isRunning());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<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>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      long procId) throws Exception {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    abortListener.addProcId(procId);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    procExec.registerListener(abortListener);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    try {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      restartMasterProcedureExecutor(procExec);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      assertTrue(procExec.unregisterListener(abortListener));<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>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (procsToAbort == null) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      procsToAbort.add(procId);<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>    @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    public void procedureLoaded(long procId) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        return;<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      procExec.abort(procId);<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>    @Override<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    @Override<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>}<a name="line.597"></a>
+<span class="sourceLineNo">572</span>  public static class InjectAbortOnLoadListener<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.575"></a>
+<span class="sourceLineNo">576</span><a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      if (procsToAbort == null) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      procsToAbort.add(procId);<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>    @Override<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    public void procedureLoaded(long procId) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        return;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      procExec.abort(procId);<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>    @Override<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>    @Override<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>}<a name="line.602"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.StepHook.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.StepHook.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.StepHook.html
index 0c87f49..e276e13 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.StepHook.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.StepHook.html
@@ -518,91 +518,96 @@
 <span class="sourceLineNo">510</span>      // Sometimes there are other procedures still executing (including asynchronously spawned by<a name="line.510"></a>
 <span class="sourceLineNo">511</span>      // procId) and due to KillAndToggleBeforeStoreUpdate flag ProcedureExecutor is stopped before<a name="line.511"></a>
 <span class="sourceLineNo">512</span>      // store update. Let all pending procedures finish normally.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (!procExec.isRunning()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due to"<a name="line.514"></a>
-<span class="sourceLineNo">515</span>            + " KillAndToggleBeforeStoreUpdate flag.");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        restartMasterProcedureExecutor(procExec);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(true, procExec.isRunning());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * is restarted and an abort() is injected.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void testRollbackRetriableFailure(<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      final int lastStep) throws Exception {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // Execute up to last step<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    // execute the rollback<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    testRestartWithAbort(procExec, procId);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(true, procExec.isRunning());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /**<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      long procId) throws Exception {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    abortListener.addProcId(procId);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    procExec.registerListener(abortListener);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      restartMasterProcedureExecutor(procExec);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      assertTrue(procExec.unregisterListener(abortListener));<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>  public static class InjectAbortOnLoadListener<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.570"></a>
+<span class="sourceLineNo">513</span>      ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      // check 3 times to confirm that the procedure executor has not been killed<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      for (int i = 0; i &lt; 3; i++) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (!procExec.isRunning()) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due" +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            " to KillAndToggleBeforeStoreUpdate flag.");<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          restartMasterProcedureExecutor(procExec);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          break;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        Thread.sleep(1000);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    assertEquals(true, procExec.isRunning());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>  /**<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   * is restarted and an abort() is injected.<a name="line.533"></a>
+<span class="sourceLineNo">534</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  public static void testRollbackRetriableFailure(<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      final int lastStep) throws Exception {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    // Execute up to last step<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // execute the rollback<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    testRestartWithAbort(procExec, procId);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>    assertEquals(true, procExec.isRunning());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<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>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      long procId) throws Exception {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    abortListener.addProcId(procId);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    procExec.registerListener(abortListener);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    try {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      restartMasterProcedureExecutor(procExec);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      assertTrue(procExec.unregisterListener(abortListener));<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>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (procsToAbort == null) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      procsToAbort.add(procId);<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>    @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    public void procedureLoaded(long procId) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        return;<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      procExec.abort(procId);<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>    @Override<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    @Override<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>}<a name="line.597"></a>
+<span class="sourceLineNo">572</span>  public static class InjectAbortOnLoadListener<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.575"></a>
+<span class="sourceLineNo">576</span><a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      if (procsToAbort == null) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      procsToAbort.add(procId);<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>    @Override<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    public void procedureLoaded(long procId) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        return;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      procExec.abort(procId);<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>    @Override<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>    @Override<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>}<a name="line.602"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
index 0c87f49..e276e13 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
@@ -518,91 +518,96 @@
 <span class="sourceLineNo">510</span>      // Sometimes there are other procedures still executing (including asynchronously spawned by<a name="line.510"></a>
 <span class="sourceLineNo">511</span>      // procId) and due to KillAndToggleBeforeStoreUpdate flag ProcedureExecutor is stopped before<a name="line.511"></a>
 <span class="sourceLineNo">512</span>      // store update. Let all pending procedures finish normally.<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (!procExec.isRunning()) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due to"<a name="line.514"></a>
-<span class="sourceLineNo">515</span>            + " KillAndToggleBeforeStoreUpdate flag.");<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.516"></a>
-<span class="sourceLineNo">517</span>        restartMasterProcedureExecutor(procExec);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>        ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>      }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    }<a name="line.520"></a>
-<span class="sourceLineNo">521</span><a name="line.521"></a>
-<span class="sourceLineNo">522</span>    assertEquals(true, procExec.isRunning());<a name="line.522"></a>
-<span class="sourceLineNo">523</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
-<span class="sourceLineNo">525</span><a name="line.525"></a>
-<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * is restarted and an abort() is injected.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public static void testRollbackRetriableFailure(<a name="line.533"></a>
-<span class="sourceLineNo">534</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.534"></a>
-<span class="sourceLineNo">535</span>      final int lastStep) throws Exception {<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    // Execute up to last step<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.537"></a>
-<span class="sourceLineNo">538</span><a name="line.538"></a>
-<span class="sourceLineNo">539</span>    // execute the rollback<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    testRestartWithAbort(procExec, procId);<a name="line.540"></a>
-<span class="sourceLineNo">541</span><a name="line.541"></a>
-<span class="sourceLineNo">542</span>    assertEquals(true, procExec.isRunning());<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  }<a name="line.544"></a>
-<span class="sourceLineNo">545</span><a name="line.545"></a>
-<span class="sourceLineNo">546</span>  /**<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   */<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      long procId) throws Exception {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    abortListener.addProcId(procId);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    procExec.registerListener(abortListener);<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    try {<a name="line.557"></a>
-<span class="sourceLineNo">558</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      restartMasterProcedureExecutor(procExec);<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    } finally {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      assertTrue(procExec.unregisterListener(abortListener));<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>  public static class InjectAbortOnLoadListener<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.570"></a>
+<span class="sourceLineNo">513</span>      ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>      // check 3 times to confirm that the procedure executor has not been killed<a name="line.514"></a>
+<span class="sourceLineNo">515</span>      for (int i = 0; i &lt; 3; i++) {<a name="line.515"></a>
+<span class="sourceLineNo">516</span>        if (!procExec.isRunning()) {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>          LOG.warn("ProcedureExecutor not running, may have been stopped by pending procedure due" +<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            " to KillAndToggleBeforeStoreUpdate flag.");<a name="line.518"></a>
+<span class="sourceLineNo">519</span>          restartMasterProcedureExecutor(procExec);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          break;<a name="line.520"></a>
+<span class="sourceLineNo">521</span>        }<a name="line.521"></a>
+<span class="sourceLineNo">522</span>        Thread.sleep(1000);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>      }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>      ProcedureTestingUtility.waitNoProcedureRunning(procExec);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    }<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    assertEquals(true, procExec.isRunning());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.528"></a>
+<span class="sourceLineNo">529</span>  }<a name="line.529"></a>
+<span class="sourceLineNo">530</span><a name="line.530"></a>
+<span class="sourceLineNo">531</span>  /**<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   * Execute the procedure up to "lastStep" and then the ProcedureExecutor<a name="line.532"></a>
+<span class="sourceLineNo">533</span>   * is restarted and an abort() is injected.<a name="line.533"></a>
+<span class="sourceLineNo">534</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.534"></a>
+<span class="sourceLineNo">535</span>   * At the end of this call the procedure should be finished and rolledback.<a name="line.535"></a>
+<span class="sourceLineNo">536</span>   * This method assert on the procedure being terminated with an AbortException.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>   */<a name="line.537"></a>
+<span class="sourceLineNo">538</span>  public static void testRollbackRetriableFailure(<a name="line.538"></a>
+<span class="sourceLineNo">539</span>      final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec, final long procId,<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      final int lastStep) throws Exception {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    // Execute up to last step<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    testRecoveryAndDoubleExecution(procExec, procId, lastStep, false);<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>    // execute the rollback<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    testRestartWithAbort(procExec, procId);<a name="line.545"></a>
+<span class="sourceLineNo">546</span><a name="line.546"></a>
+<span class="sourceLineNo">547</span>    assertEquals(true, procExec.isRunning());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    ProcedureTestingUtility.assertIsAbortException(procExec.getResult(procId));<a name="line.548"></a>
+<span class="sourceLineNo">549</span>  }<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>   * Restart the ProcedureExecutor and inject an abort to the specified procedure.<a name="line.552"></a>
+<span class="sourceLineNo">553</span>   * If the procedure implement abort() this should result in rollback being triggered.<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * At the end of this call the procedure should be finished and rolledback, if abort is implemnted<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   */<a name="line.555"></a>
+<span class="sourceLineNo">556</span>  public static void testRestartWithAbort(ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec,<a name="line.556"></a>
+<span class="sourceLineNo">557</span>      long procId) throws Exception {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    ProcedureTestingUtility.setKillAndToggleBeforeStoreUpdate(procExec, false);<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    InjectAbortOnLoadListener abortListener = new InjectAbortOnLoadListener(procExec);<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    abortListener.addProcId(procId);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    procExec.registerListener(abortListener);<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    try {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      ProcedureTestingUtility.assertProcNotYetCompleted(procExec, procId);<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      LOG.info("Restart and rollback procId=" + procId);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      restartMasterProcedureExecutor(procExec);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      ProcedureTestingUtility.waitProcedure(procExec, procId);<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    } finally {<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      assertTrue(procExec.unregisterListener(abortListener));<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>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      if (procsToAbort == null) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      }<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      procsToAbort.add(procId);<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>    @Override<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    public void procedureLoaded(long procId) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        return;<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      }<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      procExec.abort(procId);<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>    @Override<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>    @Override<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>  }<a name="line.596"></a>
-<span class="sourceLineNo">597</span>}<a name="line.597"></a>
+<span class="sourceLineNo">572</span>  public static class InjectAbortOnLoadListener<a name="line.572"></a>
+<span class="sourceLineNo">573</span>      implements ProcedureExecutor.ProcedureExecutorListener {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    private final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec;<a name="line.574"></a>
+<span class="sourceLineNo">575</span>    private TreeSet&lt;Long&gt; procsToAbort = null;<a name="line.575"></a>
+<span class="sourceLineNo">576</span><a name="line.576"></a>
+<span class="sourceLineNo">577</span>    public InjectAbortOnLoadListener(final ProcedureExecutor&lt;MasterProcedureEnv&gt; procExec) {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>      this.procExec = procExec;<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 void addProcId(long procId) {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      if (procsToAbort == null) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        procsToAbort = new TreeSet&lt;&gt;();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      }<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      procsToAbort.add(procId);<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>    @Override<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    public void procedureLoaded(long procId) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>      if (procsToAbort != null &amp;&amp; !procsToAbort.contains(procId)) {<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        return;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span>      procExec.abort(procId);<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
+<span class="sourceLineNo">595</span><a name="line.595"></a>
+<span class="sourceLineNo">596</span>    @Override<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    public void procedureAdded(long procId) { /* no-op */ }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>    @Override<a name="line.599"></a>
+<span class="sourceLineNo">600</span>    public void procedureFinished(long procId) { /* no-op */ }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>  }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>}<a name="line.602"></a>
 
 
 


[21/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class=

<TRUNCATED>

[26/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
index 680051d..940e63e 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.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":9,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":9,"i36":10,"i37":9,"i38":9,"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,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":41,"i96":41,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109"
 :10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":10,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":10,"i133":10,"i134":10,"i135":10,"i136":10,"i137":10,"i138":10,"i139":10,"i140":10,"i141":10,"i142":10,"i143":10,"i144":10,"i145":10,"i146":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":9,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":9,"i36":10,"i37":9,"i38":9,"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,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":41,"i96":41,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109"
 :10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":10,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":10,"i133":10,"i134":10,"i135":10,"i136":10,"i137":10,"i138":10,"i139":10,"i140":10,"i141":10,"i142":10,"i143":10,"i144":10,"i145":10,"i146":10,"i147":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -922,7 +922,8 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 </tr>
 <tr id="i93" class="rowColor">
 <td class="colFirst"><code>private long</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.function.Predicate-">getStorefilesSize</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.Collection-java.util.function.Predicate-">getStorefilesSize</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
 </tr>
 <tr id="i94" class="altColor">
 <td class="colFirst"><code>long</code></td>
@@ -971,33 +972,37 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 </td>
 </tr>
 <tr id="i102" class="altColor">
+<td class="colFirst"><code>private long</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalUmcompressedBytes-java.util.List-">getTotalUmcompressedBytes</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files)</code>&nbsp;</td>
+</tr>
+<tr id="i103" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#hasReferences--">hasReferences</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i103" class="rowColor">
+<tr id="i104" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#hasTooManyStoreFiles--">hasTooManyStoreFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i104" class="altColor">
+<tr id="i105" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#heapSize--">heapSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i105" class="rowColor">
+<tr id="i106" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#isPrimaryReplicaStore--">isPrimaryReplicaStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i106" class="altColor">
+<tr id="i107" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#isSloppyMemStore--">isSloppyMemStore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i107" class="rowColor">
+<tr id="i108" class="altColor">
 <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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#loadStoreFiles--">loadStoreFiles</a></span>()</code>
 <div class="block">Creates an unsorted list of StoreFile loaded in parallel
  from the given directory.</div>
 </td>
 </tr>
-<tr id="i108" class="altColor">
+<tr id="i109" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#logCompactionEndMessage-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl-java.util.List-long-long-">logCompactionEndMessage</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                        <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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
@@ -1006,63 +1011,63 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Log a very elaborate compaction completion message.</div>
 </td>
 </tr>
-<tr id="i109" class="rowColor">
+<tr id="i110" class="altColor">
 <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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#moveCompactedFilesIntoPlace-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl-java.util.List-org.apache.hadoop.hbase.security.User-">moveCompactedFilesIntoPlace</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionRequestImpl.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionRequestImpl</a>&nbsp;cr,
                            <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.fs.Path&gt;&nbsp;newFiles,
                            <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr id="i110" class="altColor">
+<tr id="i111" class="rowColor">
 <td class="colFirst"><code>(package private) <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#moveFileIntoPlace-org.apache.hadoop.fs.Path-">moveFileIntoPlace</a></span>(org.apache.hadoop.fs.Path&nbsp;newFile)</code>&nbsp;</td>
 </tr>
-<tr id="i111" class="rowColor">
+<tr id="i112" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#needsCompaction--">needsCompaction</a></span>()</code>
 <div class="block">See if there's too much store files in this store</div>
 </td>
 </tr>
-<tr id="i112" class="altColor">
+<tr id="i113" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#notifyChangedReadersObservers-java.util.List-">notifyChangedReadersObservers</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</code>
 <div class="block">Notify all observers that set of Readers has changed.</div>
 </td>
 </tr>
-<tr id="i113" class="rowColor">
+<tr id="i114" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#onConfigurationChange-org.apache.hadoop.conf.Configuration-">onConfigurationChange</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf)</code>
 <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>
 </td>
 </tr>
-<tr id="i114" class="altColor">
+<tr id="i115" 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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#openStoreFiles-java.util.Collection-">openStoreFiles</a></span>(<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/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)</code>&nbsp;</td>
 </tr>
-<tr id="i115" class="rowColor">
+<tr id="i116" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#postSnapshotOperation--">postSnapshotOperation</a></span>()</code>
 <div class="block">Perform tasks needed after the completion of snapshot operation.</div>
 </td>
 </tr>
-<tr id="i116" class="altColor">
+<tr id="i117" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#preBulkLoadHFile-java.lang.String-long-">preBulkLoadHFile</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;srcPathStr,
                 long&nbsp;seqNum)</code>
 <div class="block">This method should only be called from Region.</div>
 </td>
 </tr>
-<tr id="i117" class="rowColor">
+<tr id="i118" class="altColor">
 <td class="colFirst"><code><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/regionserver/HStore.html#preFlushSeqIDEstimation--">preFlushSeqIDEstimation</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i118" class="altColor">
+<tr id="i119" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#preSnapshotOperation--">preSnapshotOperation</a></span>()</code>
 <div class="block">Sets the store up for a region level snapshot operation.</div>
 </td>
 </tr>
-<tr id="i119" class="rowColor">
+<tr id="i120" class="altColor">
 <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/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#recreateScanners-java.util.List-boolean-boolean-boolean-org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher-byte:A-boolean-byte:A-boolean-long-boolean-">recreateScanners</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/KeyValueScanner.html" title="interface in org.apache.hadoop.hbase.regionserver">KeyValueScanner</a>&gt;&nbsp;currentFileScanners,
                 boolean&nbsp;cacheBlocks,
@@ -1078,20 +1083,20 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Recreates the scanners on the current list of active store file scanners</div>
 </td>
 </tr>
-<tr id="i120" class="altColor">
+<tr id="i121" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#refreshStoreFiles--">refreshStoreFiles</a></span>()</code>
 <div class="block">Checks the underlying store files, and opens the files that have not been opened, and removes
  the store file readers for store files no longer available.</div>
 </td>
 </tr>
-<tr id="i121" class="rowColor">
+<tr id="i122" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#refreshStoreFiles-java.util.Collection-">refreshStoreFiles</a></span>(<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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;newFiles)</code>
 <div class="block">Replaces the store files that the store has with the given files.</div>
 </td>
 </tr>
-<tr id="i122" class="altColor">
+<tr id="i123" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#refreshStoreFilesInternal-java.util.Collection-">refreshStoreFilesInternal</a></span>(<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/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)</code>
 <div class="block">Checks the underlying store files, and opens the files that  have not
@@ -1099,29 +1104,29 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  available.</div>
 </td>
 </tr>
-<tr id="i123" class="rowColor">
+<tr id="i124" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#registerChildren-org.apache.hadoop.hbase.conf.ConfigurationManager-">registerChildren</a></span>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</code>
 <div class="block">Needs to be called to register the children to the manager.</div>
 </td>
 </tr>
-<tr id="i124" class="altColor">
+<tr id="i125" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#removeCompactedfiles-java.util.Collection-boolean-">removeCompactedfiles</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedfiles,
                     boolean&nbsp;storeClosing)</code>
 <div class="block">Archives and removes the compacted files</div>
 </td>
 </tr>
-<tr id="i125" class="rowColor">
+<tr id="i126" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#removeUnneededFiles--">removeUnneededFiles</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i126" class="altColor">
+<tr id="i127" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#replaceStoreFiles-java.util.Collection-java.util.Collection-">replaceStoreFiles</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;compactedFiles,
                  <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i127" class="rowColor">
+<tr id="i128" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#replayCompactionMarker-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor-boolean-boolean-">replayCompactionMarker</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.CompactionDescriptor&nbsp;compaction,
                       boolean&nbsp;pickCompactionFiles,
@@ -1129,78 +1134,78 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Call to complete a compaction.</div>
 </td>
 </tr>
-<tr id="i128" class="altColor">
+<tr id="i129" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#reportArchivedFilesForQuota-java.util.List-java.util.List-">reportArchivedFilesForQuota</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFile.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFile</a>&gt;&nbsp;archivedFiles,
                            <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;fileSizes)</code>&nbsp;</td>
 </tr>
-<tr id="i129" class="rowColor">
+<tr id="i130" class="altColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#requestCompaction--">requestCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i130" class="altColor">
+<tr id="i131" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html?is-external=true" title="class or interface in java.util">Optional</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionContext.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">CompactionContext</a>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#requestCompaction-int-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.security.User-">requestCompaction</a></span>(int&nbsp;priority,
                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionLifeCycleTracker</a>&nbsp;tracker,
                  <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</code>&nbsp;</td>
 </tr>
-<tr id="i131" class="rowColor">
+<tr id="i132" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#setDataBlockEncoderInTest-org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder-">setDataBlockEncoderInTest</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</code>
 <div class="block">Should be used only in tests.</div>
 </td>
 </tr>
-<tr id="i132" class="altColor">
+<tr id="i133" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#setScanInfo-org.apache.hadoop.hbase.regionserver.ScanInfo-">setScanInfo</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanInfo.html" title="class in org.apache.hadoop.hbase.regionserver">ScanInfo</a>&nbsp;scanInfo)</code>
 <div class="block">Set scan info, used by test</div>
 </td>
 </tr>
-<tr id="i133" class="rowColor">
+<tr id="i134" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#shouldPerformMajorCompaction--">shouldPerformMajorCompaction</a></span>()</code>
 <div class="block">Tests whether we should run a major compaction.</div>
 </td>
 </tr>
-<tr id="i134" class="altColor">
+<tr id="i135" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#snapshot--">snapshot</a></span>()</code>
 <div class="block">Snapshot this stores memstore.</div>
 </td>
 </tr>
-<tr id="i135" class="rowColor">
+<tr id="i136" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#startReplayingFromWAL--">startReplayingFromWAL</a></span>()</code>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </td>
 </tr>
-<tr id="i136" class="altColor">
+<tr id="i137" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#stopReplayingFromWAL--">stopReplayingFromWAL</a></span>()</code>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </td>
 </tr>
-<tr id="i137" class="rowColor">
+<tr id="i138" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#throttleCompaction-long-">throttleCompaction</a></span>(long&nbsp;compactionSize)</code>&nbsp;</td>
 </tr>
-<tr id="i138" class="altColor">
+<tr id="i139" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#timeOfOldestEdit--">timeOfOldestEdit</a></span>()</code>
 <div class="block">When was the last edit done in the memstore</div>
 </td>
 </tr>
-<tr id="i139" class="rowColor">
+<tr id="i140" 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/regionserver/HStore.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i140" class="altColor">
+<tr id="i141" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#triggerMajorCompaction--">triggerMajorCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i141" class="rowColor">
+<tr id="i142" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#updateSpaceQuotaAfterFileReplacement-org.apache.hadoop.hbase.quotas.RegionSizeStore-org.apache.hadoop.hbase.client.RegionInfo-java.util.Collection-java.util.Collection-">updateSpaceQuotaAfterFileReplacement</a></span>(<a href="../../../../../org/apache/hadoop/hbase/quotas/RegionSizeStore.html" title="interface in org.apache.hadoop.hbase.quotas">RegionSizeStore</a>&nbsp;sizeStore,
                                     <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;regionInfo,
@@ -1210,14 +1215,14 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
  and adding in the size for new files.</div>
 </td>
 </tr>
-<tr id="i142" class="altColor">
+<tr id="i143" class="rowColor">
 <td class="colFirst"><code>private boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#updateStorefiles-java.util.List-long-">updateStorefiles</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs,
                 long&nbsp;snapshotId)</code>
 <div class="block">Change storeFiles adding into place the Reader produced by this new flush.</div>
 </td>
 </tr>
-<tr id="i143" class="rowColor">
+<tr id="i144" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#upsert-java.lang.Iterable-long-org.apache.hadoop.hbase.regionserver.MemStoreSizing-">upsert</a></span>(<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;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
       long&nbsp;readpoint,
@@ -1225,17 +1230,17 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <div class="block">Adds or replaces the specified KeyValues.</div>
 </td>
 </tr>
-<tr id="i144" class="altColor">
+<tr id="i145" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#validateStoreFile-org.apache.hadoop.fs.Path-">validateStoreFile</a></span>(org.apache.hadoop.fs.Path&nbsp;path)</code>
 <div class="block">Validates a store file by opening and closing it.</div>
 </td>
 </tr>
-<tr id="i145" class="rowColor">
+<tr id="i146" class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#versionsToReturn-int-">versionsToReturn</a></span>(int&nbsp;wantedVersions)</code>&nbsp;</td>
 </tr>
-<tr id="i146" class="altColor">
+<tr id="i147" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#writeCompactionWalRecord-java.util.Collection-java.util.Collection-">writeCompactionWalRecord</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;filesCompacted,
                         <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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;newFiles)</code>
@@ -1754,7 +1759,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2435">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2428">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -1763,7 +1768,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockListLast">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2439">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2432">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 </li>
@@ -1810,7 +1815,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemstore</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.337">getMemstore</a>()</pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStore.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.344">getMemstore</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>MemStore Instance to use in this store.</dd>
@@ -1823,7 +1828,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createCacheConf</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.371">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.378">createCacheConf</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <div class="block">Creates the cache config.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1837,7 +1842,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreEngine</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.383">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreEngine.html" title="class in org.apache.hadoop.hbase.regionserver">StoreEngine</a>&lt;?,?,?,?&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.390">createStoreEngine</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                                  org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                  <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;kvComparator)
                                           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>
@@ -1861,7 +1866,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>determineTTLFromFamily</h4>
-<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.392">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
+<pre>public static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.399">determineTTLFromFamily</a>(<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;family)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>family</code> - </dd>
@@ -1876,7 +1881,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilyName</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/HStore.html#line.408">getColumnFamilyName</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/HStore.html#line.415">getColumnFamilyName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getColumnFamilyName--">getColumnFamilyName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1889,7 +1894,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.413">getTableName</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.420">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1902,7 +1907,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFileSystem</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.418">getFileSystem</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.fs.FileSystem&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.425">getFileSystem</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFileSystem--">getFileSystem</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1915,7 +1920,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionFileSystem</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.422">getRegionFileSystem</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">HRegionFileSystem</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.429">getRegionFileSystem</a>()</pre>
 </li>
 </ul>
 <a name="getStoreFileTtl--">
@@ -1924,7 +1929,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStoreFileTtl</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.428">getStoreFileTtl</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.435">getStoreFileTtl</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getStoreFileTtl--">getStoreFileTtl</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1939,7 +1944,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreFlushSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.434">getMemStoreFlushSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.441">getMemStoreFlushSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getMemStoreFlushSize--">getMemStoreFlushSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -1954,7 +1959,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getFlushableSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.440">getFlushableSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.447">getFlushableSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getFlushableSize--">getFlushableSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1971,7 +1976,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getSnapshotSize</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.445">getSnapshotSize</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.452">getSnapshotSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getSnapshotSize--">getSnapshotSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -1986,7 +1991,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionCheckMultiplier</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.450">getCompactionCheckMultiplier</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.457">getCompactionCheckMultiplier</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getCompactionCheckMultiplier--">getCompactionCheckMultiplier</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreConfigInformation</a></code></dd>
@@ -2003,7 +2008,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getBlockingFileCount</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.455">getBlockingFileCount</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.462">getBlockingFileCount</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreConfigInformation.html#getBlockingFileCount--">StoreConfigInformation</a></code></span></div>
 <div class="block">The number of files required before flushes for this store will be blocked.</div>
 <dl>
@@ -2018,7 +2023,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getBytesPerChecksum</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.465">getBytesPerChecksum</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.472">getBytesPerChecksum</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns the configured bytesPerChecksum value.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2034,7 +2039,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getChecksumType</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.475">getChecksumType</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util">ChecksumType</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.482">getChecksumType</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Returns the configured checksum algorithm.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2050,7 +2055,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCloseCheckInterval</h4>
-<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.487">getCloseCheckInterval</a>()</pre>
+<pre>public static&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.494">getCloseCheckInterval</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>how many bytes to write between status checks</dd>
@@ -2063,7 +2068,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumnFamilyDescriptor</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.492">getColumnFamilyDescriptor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/ColumnFamilyDescriptor.html" title="interface in org.apache.hadoop.hbase.client">ColumnFamilyDescriptor</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.499">getColumnFamilyDescriptor</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getColumnFamilyDescriptor--">getColumnFamilyDescriptor</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2076,7 +2081,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxSequenceId</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/HStore.html#line.497">getMaxSequenceId</a>()</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/HStore.html#line.504">getMaxSequenceId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMaxSequenceId--">getMaxSequenceId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2091,7 +2096,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxMemStoreTS</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/HStore.html#line.502">getMaxMemStoreTS</a>()</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/HStore.html#line.509">getMaxMemStoreTS</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getMaxMemStoreTS--">getMaxMemStoreTS</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2107,7 +2112,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.ht
 <li class="blockList">
 <h4>getStoreHomedir</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.513">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.520">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                                                                     <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;hri,
                                                                     byte[]&nbsp;family)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
@@ -2128,7 +2133,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <li class="blockList">
 <h4>getStoreHomedir</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.525">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
+public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.532">getStoreHomedir</a>(org.apache.hadoop.fs.Path&nbsp;tabledir,
                                                                     <a href="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;encodedName,
                                                                     byte[]&nbsp;family)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;</div>
@@ -2148,7 +2153,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataBlockEncoder</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.533">getDataBlockEncoder</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.540">getDataBlockEncoder</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the data block encoder</dd>
@@ -2161,7 +2166,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>setDataBlockEncoderInTest</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.541">setDataBlockEncoderInTest</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.548">setDataBlockEncoderInTest</a>(<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.html" title="interface in org.apache.hadoop.hbase.io.hfile">HFileDataBlockEncoder</a>&nbsp;blockEncoder)</pre>
 <div class="block">Should be used only in tests.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2175,7 +2180,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>loadStoreFiles</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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.550">loadStoreFiles</a>()
+<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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.557">loadStoreFiles</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">Creates an unsorted list of StoreFile loaded in parallel
  from the given directory.</div>
@@ -2191,7 +2196,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>openStoreFiles</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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.555">openStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)
+<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/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.562">openStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;files)
                                  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>
@@ -2205,7 +2210,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.615">refreshStoreFiles</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.618">refreshStoreFiles</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/regionserver/Store.html#refreshStoreFiles--">Store</a></code></span></div>
 <div class="block">Checks the underlying store files, and opens the files that have not been opened, and removes
@@ -2225,7 +2230,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFiles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.625">refreshStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;newFiles)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.628">refreshStoreFiles</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;newFiles)
                        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">Replaces the store files that the store has with the given files. Mainly used by secondary
  region replicas to keep up to date with the primary region files.</div>
@@ -2241,7 +2246,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>refreshStoreFilesInternal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.640">refreshStoreFilesInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.643">refreshStoreFilesInternal</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&gt;&nbsp;newFiles)
                                 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">Checks the underlying store files, and opens the files that  have not
  been opened, and removes the store file readers for store files no longer
@@ -2259,7 +2264,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreFileAndReader</h4>
-<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.693">createStoreFileAndReader</a>(org.apache.hadoop.fs.Path&nbsp;p)
+<pre>protected&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.696">createStoreFileAndReader</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>
@@ -2273,7 +2278,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createStoreFileAndReader</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.698">createStoreFileAndReader</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;info)
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.701">createStoreFileAndReader</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;info)
                                      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>
@@ -2287,7 +2292,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>startReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.710">startReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.713">startReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that next coming updates
  are going to be part of the replaying edits from WAL</div>
 </li>
@@ -2298,7 +2303,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>stopReplayingFromWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.718">stopReplayingFromWAL</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.721">stopReplayingFromWAL</a>()</pre>
 <div class="block">This message intends to inform the MemStore that the replaying edits from WAL
  are done</div>
 </li>
@@ -2309,7 +2314,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.725">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.728">add</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreSizing)</pre>
 <div class="block">Adds a value to the memstore</div>
 </li>
@@ -2320,7 +2325,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>add</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.742">add</a>(<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;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.745">add</a>(<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;<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;cells,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSizing.html" title="interface in org.apache.hadoop.hbase.regionserver">MemStoreSizing</a>&nbsp;memstoreSizing)</pre>
 <div class="block">Adds the specified value to the memstore</div>
 </li>
@@ -2331,7 +2336,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>timeOfOldestEdit</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.757">timeOfOldestEdit</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.760">timeOfOldestEdit</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#timeOfOldestEdit--">Store</a></code></span></div>
 <div class="block">When was the last edit done in the memstore</div>
 <dl>
@@ -2346,7 +2351,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getStorefiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.765">getStorefiles</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.768">getStorefiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getStorefiles--">getStorefiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2361,7 +2366,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactedFiles</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.770">getCompactedFiles</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.773">getCompactedFiles</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html#getCompactedFiles--">getCompactedFiles</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></code></dd>
@@ -2374,7 +2379,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>assertBulkLoadHFileOk</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.778">assertBulkLoadHFileOk</a>(org.apache.hadoop.fs.Path&nbsp;srcPath)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.781">assertBulkLoadHFileOk</a>(org.apache.hadoop.fs.Path&nbsp;srcPath)
                            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">This throws a WrongRegionException if the HFile does not fit in this region, or an
  InvalidHFileException if the HFile is not valid.</div>
@@ -2390,7 +2395,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>preBulkLoadHFile</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.857">preBulkLoadHFile</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;srcPathStr,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/Pair.html" title="class in org.apache.hadoop.hbase.util">Pair</a>&lt;org.apache.hadoop.fs.Path,org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.860">preBulkLoadHFile</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;srcPathStr,
                                                                                   long&nbsp;seqNum)
                                                                            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">This method should only be called from Region. It is assumed that the ranges of values in the
@@ -2410,7 +2415,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.862">bulkLoadHFile</a>(byte[]&nbsp;family,
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.865">bulkLoadHFile</a>(byte[]&nbsp;family,
                                                <a href="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;srcPathStr,
                                                org.apache.hadoop.fs.Path&nbsp;dstPath)
                                         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>
@@ -2426,7 +2431,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.884">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;fileInfo)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.887">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileInfo.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileInfo</a>&nbsp;fileInfo)
                    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>
@@ -2440,7 +2445,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFile</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.889">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;sf)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.892">bulkLoadHFile</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;sf)
                     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>
@@ -2454,7 +2459,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>close</h4>
-<pre>public&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableCollection&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.921">close</a>()
+<pre>public&nbsp;org.apache.hbase.thirdparty.com.google.common.collect.ImmutableCollection&lt;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.924">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">Close all the readers We don't need to worry about subsequent requests because the Region holds
  a write lock that will prevent any more reads or writes.</div>
@@ -2472,7 +2477,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.988">snapshot</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.991">snapshot</a>()</pre>
 <div class="block">Snapshot this stores memstore. Call before running
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#flushCache-long-org.apache.hadoop.hbase.regionserver.MemStoreSnapshot-org.apache.hadoop.hbase.monitoring.MonitoredTask-org.apache.hadoop.hbase.regionserver.throttle.ThroughputController-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-"><code>flushCache(long, MemStoreSnapshot, MonitoredTask, ThroughputController,
  FlushLifeCycleTracker)</code></a>
@@ -2485,7 +2490,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>protected&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;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1006">flushCache</a>(long&nbsp;logCacheFlushId,
+<pre>protected&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;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1009">flushCache</a>(long&nbsp;logCacheFlushId,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a>&nbsp;snapshot,
                                                      <a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status,
                                                      <a href="../../../../../org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.html" title="interface in org.apache.hadoop.hbase.regionserver.throttle">ThroughputController</a>&nbsp;throughputController,
@@ -2511,7 +2516,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>commitFile</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1059">commitFile</a>(org.apache.hadoop.fs.Path&nbsp;path,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1062">commitFile</a>(org.apache.hadoop.fs.Path&nbsp;path,
                               long&nbsp;logCacheFlushId,
                               <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></pre>
@@ -2533,7 +2538,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createWriterInTmp</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1089">createWriterInTmp</a>(long&nbsp;maxKeyCount,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFileWriter.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileWriter</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1092">createWriterInTmp</a>(long&nbsp;maxKeyCount,
                                          <a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compression,
                                          boolean&nbsp;isCompaction,
                                          boolean&nbsp;includeMVCCReadpoint,
@@ -2560,7 +2565,7 @@ public static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../src-ht
 <ul class="blockList">
 <li class="blockList">
 <h4>createFileContext</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1120">createFileContext</a>(<a href="../../../../../org/apache/hadoop/hbase/io/compress/Compression.Algorithm.html" title="enum in org.apache.hadoop.hbase.io.compress">Compression.Algorithm</a>&nbsp;compression,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/hfile/HFileContext.html" title="class in org.apache.hadoop.hbase.io.hfile">HFileContext</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.1123">createFileContext</a>(<a href="../.

<TRUNCATED>

[04/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
index 8d98ec3..f2d5735 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
@@ -179,4148 +179,4147 @@
 <span class="sourceLineNo">171</span> * avoiding port contention if another local HBase instance is already running).<a name="line.171"></a>
 <span class="sourceLineNo">172</span> * &lt;p&gt;To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"<a name="line.172"></a>
 <span class="sourceLineNo">173</span> * setting it to true.<a name="line.173"></a>
-<span class="sourceLineNo">174</span> * Trigger pre commit.<a name="line.174"></a>
-<span class="sourceLineNo">175</span> */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>@InterfaceAudience.Public<a name="line.176"></a>
-<span class="sourceLineNo">177</span>@SuppressWarnings("deprecation")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * used in mini dfs.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @deprecated can be used only with mini dfs<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Deprecated<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * table.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<a name="line.194"></a>
+<span class="sourceLineNo">174</span> */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>@InterfaceAudience.Public<a name="line.175"></a>
+<span class="sourceLineNo">176</span>@SuppressWarnings("deprecation")<a name="line.176"></a>
+<span class="sourceLineNo">177</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * used in mini dfs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @deprecated can be used only with mini dfs<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Deprecated<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * table.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<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>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private MiniDFSCluster dfsCluster = null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  private MiniMRCluster mrCluster = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private volatile boolean miniClusterRunning;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private String hadoopLogDir;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    * HBaseTestingUtility*/<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private volatile Connection connection;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private static String FS_URI;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   *<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param port the port number to check for availability<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public static boolean available(int port) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ServerSocket ss = null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    DatagramSocket ds = null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    try {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ss = new ServerSocket(port);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      ss.setReuseAddress(true);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      ds = new DatagramSocket(port);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      ds.setReuseAddress(true);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return true;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    } catch (IOException e) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      // Do nothing<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } finally {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      if (ds != null) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ds.close();<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 (ss != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          ss.close();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          /* should not be thrown */<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><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * testing.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    for (Compression.Algorithm comprAlgo :<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        configurations.add(new Object[] { comprAlgo, bloomType });<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>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    configurations.add(new Object[] { false, true });<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, false });<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    configurations.add(new Object[] { true, true });<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, true });<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, false, false });<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, true });<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    configurations.add(new Object[] { false, true, false });<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, true });<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, false, false });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, true });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    configurations.add(new Object[] { true, true, false });<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return Collections.unmodifiableList(configurations);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      bloomAndCompressionCombinations();<a name="line.300"></a>
+<span class="sourceLineNo">196</span>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private MiniDFSCluster dfsCluster = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private MiniMRCluster mrCluster = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private volatile boolean miniClusterRunning;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  private String hadoopLogDir;<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    * HBaseTestingUtility*/<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile Connection connection;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private static String FS_URI;<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param port the port number to check for availability<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public static boolean available(int port) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    ServerSocket ss = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    DatagramSocket ds = null;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      ss = new ServerSocket(port);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      ss.setReuseAddress(true);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      ds = new DatagramSocket(port);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      ds.setReuseAddress(true);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return true;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // Do nothing<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    } finally {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (ds != null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        ds.close();<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>      if (ss != null) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          ss.close();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        } catch (IOException e) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          /* should not be thrown */<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return false;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * testing.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (Compression.Algorithm comprAlgo :<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        configurations.add(new Object[] { comprAlgo, bloomType });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    configurations.add(new Object[] { false, false });<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, true });<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    configurations.add(new Object[] { true, false });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, true });<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    configurations.add(new Object[] { false, false, true });<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, false });<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, true, true });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    configurations.add(new Object[] { true, false, true });<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, false });<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, true, true });<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, false });<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    return Collections.unmodifiableList(configurations);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      bloomAndCompressionCombinations();<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><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   *<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * at which point they will switch to using mini DFS for storage.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public HBaseTestingUtility() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * at which point they will switch to using mini DFS for storage.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param conf The configuration to use for further operations<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    super(conf);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Save this for when setting default file:// breaks things<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // Every cluster is a local cluster until we start DFS<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    // Note that conf could be null, but this.conf will not be<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    String dataTestDir = getDataTestDir().toString();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    // tests opt-out for random port assignment<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return a normal HBaseTestingUtility<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   */<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  @Deprecated<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @return a normal HBaseTestingUtility<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   */<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Deprecated<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return new HBaseTestingUtility(c);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    closeRegionAndWAL((HRegion)r);<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>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (r == null) return;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    r.close();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (r.getWAL() == null) return;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    r.getWAL().close();<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>  /**<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * make a copy and use that.  Do<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return Instance of Configuration.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public Configuration getConfiguration() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return super.getConfiguration();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Give it a random name so can have many concurrent tests running if<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * System property, as it's what minidfscluster bases<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * instances -- another instance could grab the temporary<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * single instance only is how the minidfscluster works.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * We also create the underlying directory for<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.425"></a>
-<span class="sourceLineNo">426</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.426"></a>
-<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * @return The calculated data test build directory, if newly-created.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  protected Path setupDataTestDir() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    Path testPath = super.setupDataTestDir();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (null == testPath) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      "hadoop.log.dir",<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      testPath, "hadoop-log-dir");<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    createSubDirAndSystemProperty(<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      "hadoop.tmp.dir",<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      testPath, "hadoop-tmp-dir");<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    createSubDir(<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      "mapreduce.cluster.local.dir",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      testPath, "mapred-local-dir");<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    String propertyName, Path parent, String subDirName){<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    String sysValue = System.getProperty(propertyName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (sysValue != null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // There is already a value set. So we do nothing but hope<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      //  that there will be no conflicts<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      String confValue = conf.get(propertyName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.466"></a>
-<span class="sourceLineNo">467</span>       LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>         propertyName + " property value differs in configuration and system: "+<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      createSubDir(propertyName, parent, subDirName);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      System.setProperty(propertyName, conf.get(propertyName));<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><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * for the test filesystem by default<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #setupDataTestDirOnTestFS()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see #getTestFileSystem()<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    FileSystem fs = getTestFileSystem();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return META table descriptor<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Deprecated<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @return META table descriptor<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * if the test relies on it.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return a unique path in the test filesystem<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    if (dataTestDirOnTestFS == null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * if the test relies on it.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a unique path in the test filesystem<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /**<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Sets up a path in test filesystem to be used by tests.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Creates a new directory if not already setup.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   */<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private void setupDataTestDirOnTestFS() throws IOException {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    if (dataTestDirOnTestFS != null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      LOG.warn("Data test on test fs dir already setup in "<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          + dataTestDirOnTestFS.toString());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<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>   * Sets up a new path in test filesystem to be used by tests.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   */<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private Path getNewDataTestDirOnTestFS() throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    //The file system can be either local, mini dfs, or if the configuration<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    //is supplied externally, it can be an external cluster FS. If it is a local<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    //file system, the tests should use getBaseTestDir, otherwise, we can use<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    //the working directory, and create a unique sub dir there<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem fs = getTestFileSystem();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path newDataTestDir;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    String randomStr = getRandomUUID().toString();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      newDataTestDir = new Path(getDataTestDir(), randomStr);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      File dataTestDir = new File(newDataTestDir.toString());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (deleteOnExit()) dataTestDir.deleteOnExit();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      Path base = getBaseTestDirOnTestFS();<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      newDataTestDir = new Path(base, randomStr);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return newDataTestDir;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<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>   * Cleans the test data directory on the test filesystem.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return True if we removed the test dirs<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean cleanupDataTestDirOnTestFS() throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    if (ret)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      dataTestDirOnTestFS = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    return ret;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Cleans a subdirectory under the test data directory on the test filesystem.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * @return True if we removed child<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * @throws IOException<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
-<span class="sourceLineNo">591</span>  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    Path cpath = getDataTestDirOnTestFS(subdirName);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    return getTestFileSystem().delete(cpath, true);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  /**<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * Start a minidfscluster.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @param servers How many DNs to start.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws Exception<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * @see #shutdownMiniDFSCluster()<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return The mini dfs cluster created.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return startMiniDFSCluster(servers, null);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Start a minidfscluster.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * This is useful if you want to run datanode on distinct hosts for things<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * like HDFS block location verification.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * If you start MiniDFSCluster without host names, all instances of the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * datanodes will have the same host name.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * @param hosts hostnames DNs to run on.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @throws Exception<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @see #shutdownMiniDFSCluster()<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @return The mini dfs cluster created.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  public MiniDFSCluster startMiniDFSCluster(final String hosts[])<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  throws Exception {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if ( hosts != null &amp;&amp; hosts.length != 0) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return startMiniDFSCluster(hosts.length, hosts);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      return startMiniDFSCluster(1, null);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Start a minidfscluster.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Can only create one.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param servers How many DNs to start.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param hosts hostnames DNs to run on.<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @throws Exception<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @see #shutdownMiniDFSCluster()<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @return The mini dfs cluster created.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[])<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  throws Exception {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return startMiniDFSCluster(servers, null, hosts);<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>  private void setFs() throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if(this.dfsCluster == null){<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      LOG.info("Skipping setting fs because dfsCluster is null");<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    FileSystem fs = this.dfsCluster.getFileSystem();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    FSUtils.setFsDefault(this.conf, new Path(fs.getUri()));<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    // re-enable this check with dfs<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);<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>  public MiniDFSCluster startMiniDFSCluster(int servers, final  String racks[], String hosts[])<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      throws Exception {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    createDirsAndSetProperties();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Error level to skip some warnings specific to the minicluster. See HBASE-4709<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.util.MBeans.class).<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.impl.MetricsSystemImpl.class).<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    TraceUtil.initTracer(conf);<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    this.dfsCluster = new MiniDFSCluster(0, this.conf, servers, true, true,<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        true, null, racks, hosts, null);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // Set this just-started cluster as our filesystem.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    setFs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Wait for the cluster to be totally up<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    this.dfsCluster.waitClusterUp();<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    //reset the test directory for test file system<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    dataTestDirOnTestFS = null;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String dataTestDir = getDataTestDir().toString();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(HConstants.HBASE_DIR, dataTestDir);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return this.dfsCluster;<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>  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    createDirsAndSetProperties();<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    dfsCluster = new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        null, null, null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return dfsCluster;<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>  /** This is used before starting HDFS and map-reduce mini-clusters */<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  private void createDirsAndSetProperties() throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    setupClusterTestDir();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    conf.set(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.setProperty(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    createDirAndSetProperty("cache_data", "test.cache.data");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    createDirAndSetProperty("hadoop_tmp", "hadoop.tmp.dir");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    hadoopLogDir = createDirAndSetProperty("hadoop_logs", "hadoop.log.dir");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    createDirAndSetProperty("mapred_local", "mapreduce.cluster.local.dir");<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    createDirAndSetProperty("mapred_temp", "mapreduce.cluster.temp.dir");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    enableShortCircuit();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Path root = getDataTestDirOnTestFS("hadoop");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    conf.set(MapreduceTestingShim.getMROutputDirProp(),<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      new Path(root, "mapred-output-dir").toString());<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set("mapreduce.jobtracker.staging.root.dir",<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    conf.set("yarn.app.mapreduce.am.staging-dir",<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      new Path(root, "mapreduce-am-staging-root-dir").toString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * at which point they will switch to using mini DFS for storage.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   */<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public HBaseTestingUtility() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   *<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   *<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * at which point they will switch to using mini DFS for storage.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param conf The configuration to use for further operations<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    super(conf);<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Save this for when setting default file:// breaks things<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Every cluster is a local cluster until we start DFS<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Note that conf could be null, but this.conf will not be<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String dataTestDir = getDataTestDir().toString();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // tests opt-out for random port assignment<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, 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>  /**<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @return a normal HBaseTestingUtility<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Deprecated<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return a normal HBaseTestingUtility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Deprecated<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new HBaseTestingUtility(c);<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>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    closeRegionAndWAL((HRegion)r);<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>  /**<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (r == null) return;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    r.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (r.getWAL() == null) return;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    r.getWAL().close();<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>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * make a copy and use that.  Do<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * @return Instance of Configuration.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public Configuration getConfiguration() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return super.getConfiguration();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Give it a random name so can have many concurrent tests running if<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * System property, as it's what minidfscluster bases<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * instances -- another instance could grab the temporary<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * single instance only is how the minidfscluster works.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * We also create the underlying directory for<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   *<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return The calculated data test build directory, if newly-created.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  protected Path setupDataTestDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Path testPath = super.setupDataTestDir();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (null == testPath) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      "hadoop.log.dir",<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      testPath, "hadoop-log-dir");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    createSubDirAndSystemProperty(<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      "hadoop.tmp.dir",<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      testPath, "hadoop-tmp-dir");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    createSubDir(<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      "mapreduce.cluster.local.dir",<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      testPath, "mapred-local-dir");<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    String propertyName, Path parent, String subDirName){<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String sysValue = System.getProperty(propertyName);<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (sysValue != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // There is already a value set. So we do nothing but hope<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      //  that there will be no conflicts<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String confValue = conf.get(propertyName);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.465"></a>
+<span class="sourceLineNo">466</span>       LOG.warn(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>         propertyName + " property value differs in configuration and system: "+<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      createSubDir(propertyName, parent, subDirName);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      System.setProperty(propertyName, conf.get(propertyName));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<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>  /**<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * for the test filesystem by default<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #setupDataTestDirOnTestFS()<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see #getTestFileSystem()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    FileSystem fs = getTestFileSystem();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>   * @return META table descriptor<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  @Deprecated<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>   * @return META table descriptor<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    } catch (IOException e) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  /**<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * if the test relies on it.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a unique path in the test filesystem<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   */<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    if (dataTestDirOnTestFS == null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * if the test relies on it.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @return a unique path in the test filesystem<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="lin

<TRUNCATED>

[06/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
index 8d98ec3..f2d5735 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
@@ -179,4148 +179,4147 @@
 <span class="sourceLineNo">171</span> * avoiding port contention if another local HBase instance is already running).<a name="line.171"></a>
 <span class="sourceLineNo">172</span> * &lt;p&gt;To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"<a name="line.172"></a>
 <span class="sourceLineNo">173</span> * setting it to true.<a name="line.173"></a>
-<span class="sourceLineNo">174</span> * Trigger pre commit.<a name="line.174"></a>
-<span class="sourceLineNo">175</span> */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>@InterfaceAudience.Public<a name="line.176"></a>
-<span class="sourceLineNo">177</span>@SuppressWarnings("deprecation")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * used in mini dfs.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @deprecated can be used only with mini dfs<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Deprecated<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * table.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<a name="line.194"></a>
+<span class="sourceLineNo">174</span> */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>@InterfaceAudience.Public<a name="line.175"></a>
+<span class="sourceLineNo">176</span>@SuppressWarnings("deprecation")<a name="line.176"></a>
+<span class="sourceLineNo">177</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * used in mini dfs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @deprecated can be used only with mini dfs<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Deprecated<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * table.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<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>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private MiniDFSCluster dfsCluster = null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  private MiniMRCluster mrCluster = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private volatile boolean miniClusterRunning;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private String hadoopLogDir;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    * HBaseTestingUtility*/<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private volatile Connection connection;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private static String FS_URI;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   *<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param port the port number to check for availability<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public static boolean available(int port) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ServerSocket ss = null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    DatagramSocket ds = null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    try {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ss = new ServerSocket(port);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      ss.setReuseAddress(true);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      ds = new DatagramSocket(port);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      ds.setReuseAddress(true);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return true;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    } catch (IOException e) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      // Do nothing<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } finally {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      if (ds != null) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ds.close();<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 (ss != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          ss.close();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          /* should not be thrown */<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><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * testing.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    for (Compression.Algorithm comprAlgo :<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        configurations.add(new Object[] { comprAlgo, bloomType });<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>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    configurations.add(new Object[] { false, true });<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, false });<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    configurations.add(new Object[] { true, true });<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, true });<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, false, false });<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, true });<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    configurations.add(new Object[] { false, true, false });<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, true });<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, false, false });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, true });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    configurations.add(new Object[] { true, true, false });<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return Collections.unmodifiableList(configurations);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      bloomAndCompressionCombinations();<a name="line.300"></a>
+<span class="sourceLineNo">196</span>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private MiniDFSCluster dfsCluster = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private MiniMRCluster mrCluster = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private volatile boolean miniClusterRunning;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  private String hadoopLogDir;<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    * HBaseTestingUtility*/<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile Connection connection;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private static String FS_URI;<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param port the port number to check for availability<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public static boolean available(int port) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    ServerSocket ss = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    DatagramSocket ds = null;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      ss = new ServerSocket(port);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      ss.setReuseAddress(true);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      ds = new DatagramSocket(port);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      ds.setReuseAddress(true);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return true;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // Do nothing<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    } finally {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (ds != null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        ds.close();<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>      if (ss != null) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          ss.close();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        } catch (IOException e) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          /* should not be thrown */<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return false;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * testing.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (Compression.Algorithm comprAlgo :<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        configurations.add(new Object[] { comprAlgo, bloomType });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    configurations.add(new Object[] { false, false });<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, true });<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    configurations.add(new Object[] { true, false });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, true });<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    configurations.add(new Object[] { false, false, true });<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, false });<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, true, true });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    configurations.add(new Object[] { true, false, true });<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, false });<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, true, true });<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, false });<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    return Collections.unmodifiableList(configurations);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      bloomAndCompressionCombinations();<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><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   *<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * at which point they will switch to using mini DFS for storage.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public HBaseTestingUtility() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * at which point they will switch to using mini DFS for storage.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param conf The configuration to use for further operations<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    super(conf);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Save this for when setting default file:// breaks things<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // Every cluster is a local cluster until we start DFS<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    // Note that conf could be null, but this.conf will not be<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    String dataTestDir = getDataTestDir().toString();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    // tests opt-out for random port assignment<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return a normal HBaseTestingUtility<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   */<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  @Deprecated<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @return a normal HBaseTestingUtility<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   */<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Deprecated<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return new HBaseTestingUtility(c);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    closeRegionAndWAL((HRegion)r);<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>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (r == null) return;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    r.close();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (r.getWAL() == null) return;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    r.getWAL().close();<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>  /**<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * make a copy and use that.  Do<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return Instance of Configuration.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public Configuration getConfiguration() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return super.getConfiguration();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Give it a random name so can have many concurrent tests running if<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * System property, as it's what minidfscluster bases<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * instances -- another instance could grab the temporary<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * single instance only is how the minidfscluster works.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * We also create the underlying directory for<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.425"></a>
-<span class="sourceLineNo">426</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.426"></a>
-<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * @return The calculated data test build directory, if newly-created.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  protected Path setupDataTestDir() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    Path testPath = super.setupDataTestDir();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (null == testPath) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      "hadoop.log.dir",<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      testPath, "hadoop-log-dir");<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    createSubDirAndSystemProperty(<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      "hadoop.tmp.dir",<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      testPath, "hadoop-tmp-dir");<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    createSubDir(<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      "mapreduce.cluster.local.dir",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      testPath, "mapred-local-dir");<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    String propertyName, Path parent, String subDirName){<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    String sysValue = System.getProperty(propertyName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (sysValue != null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // There is already a value set. So we do nothing but hope<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      //  that there will be no conflicts<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      String confValue = conf.get(propertyName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.466"></a>
-<span class="sourceLineNo">467</span>       LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>         propertyName + " property value differs in configuration and system: "+<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      createSubDir(propertyName, parent, subDirName);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      System.setProperty(propertyName, conf.get(propertyName));<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><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * for the test filesystem by default<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #setupDataTestDirOnTestFS()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see #getTestFileSystem()<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    FileSystem fs = getTestFileSystem();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return META table descriptor<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Deprecated<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @return META table descriptor<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * if the test relies on it.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return a unique path in the test filesystem<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    if (dataTestDirOnTestFS == null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * if the test relies on it.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a unique path in the test filesystem<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /**<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Sets up a path in test filesystem to be used by tests.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Creates a new directory if not already setup.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   */<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private void setupDataTestDirOnTestFS() throws IOException {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    if (dataTestDirOnTestFS != null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      LOG.warn("Data test on test fs dir already setup in "<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          + dataTestDirOnTestFS.toString());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<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>   * Sets up a new path in test filesystem to be used by tests.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   */<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private Path getNewDataTestDirOnTestFS() throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    //The file system can be either local, mini dfs, or if the configuration<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    //is supplied externally, it can be an external cluster FS. If it is a local<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    //file system, the tests should use getBaseTestDir, otherwise, we can use<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    //the working directory, and create a unique sub dir there<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem fs = getTestFileSystem();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path newDataTestDir;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    String randomStr = getRandomUUID().toString();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      newDataTestDir = new Path(getDataTestDir(), randomStr);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      File dataTestDir = new File(newDataTestDir.toString());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (deleteOnExit()) dataTestDir.deleteOnExit();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      Path base = getBaseTestDirOnTestFS();<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      newDataTestDir = new Path(base, randomStr);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return newDataTestDir;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<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>   * Cleans the test data directory on the test filesystem.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return True if we removed the test dirs<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean cleanupDataTestDirOnTestFS() throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    if (ret)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      dataTestDirOnTestFS = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    return ret;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Cleans a subdirectory under the test data directory on the test filesystem.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * @return True if we removed child<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * @throws IOException<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
-<span class="sourceLineNo">591</span>  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    Path cpath = getDataTestDirOnTestFS(subdirName);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    return getTestFileSystem().delete(cpath, true);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  /**<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * Start a minidfscluster.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @param servers How many DNs to start.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws Exception<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * @see #shutdownMiniDFSCluster()<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return The mini dfs cluster created.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return startMiniDFSCluster(servers, null);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Start a minidfscluster.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * This is useful if you want to run datanode on distinct hosts for things<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * like HDFS block location verification.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * If you start MiniDFSCluster without host names, all instances of the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * datanodes will have the same host name.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * @param hosts hostnames DNs to run on.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @throws Exception<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @see #shutdownMiniDFSCluster()<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @return The mini dfs cluster created.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  public MiniDFSCluster startMiniDFSCluster(final String hosts[])<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  throws Exception {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if ( hosts != null &amp;&amp; hosts.length != 0) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return startMiniDFSCluster(hosts.length, hosts);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      return startMiniDFSCluster(1, null);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Start a minidfscluster.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Can only create one.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param servers How many DNs to start.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param hosts hostnames DNs to run on.<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @throws Exception<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @see #shutdownMiniDFSCluster()<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @return The mini dfs cluster created.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[])<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  throws Exception {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return startMiniDFSCluster(servers, null, hosts);<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>  private void setFs() throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if(this.dfsCluster == null){<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      LOG.info("Skipping setting fs because dfsCluster is null");<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    FileSystem fs = this.dfsCluster.getFileSystem();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    FSUtils.setFsDefault(this.conf, new Path(fs.getUri()));<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    // re-enable this check with dfs<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);<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>  public MiniDFSCluster startMiniDFSCluster(int servers, final  String racks[], String hosts[])<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      throws Exception {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    createDirsAndSetProperties();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Error level to skip some warnings specific to the minicluster. See HBASE-4709<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.util.MBeans.class).<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.impl.MetricsSystemImpl.class).<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    TraceUtil.initTracer(conf);<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    this.dfsCluster = new MiniDFSCluster(0, this.conf, servers, true, true,<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        true, null, racks, hosts, null);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // Set this just-started cluster as our filesystem.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    setFs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Wait for the cluster to be totally up<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    this.dfsCluster.waitClusterUp();<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    //reset the test directory for test file system<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    dataTestDirOnTestFS = null;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String dataTestDir = getDataTestDir().toString();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(HConstants.HBASE_DIR, dataTestDir);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return this.dfsCluster;<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>  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    createDirsAndSetProperties();<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    dfsCluster = new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        null, null, null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return dfsCluster;<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>  /** This is used before starting HDFS and map-reduce mini-clusters */<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  private void createDirsAndSetProperties() throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    setupClusterTestDir();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    conf.set(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.setProperty(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    createDirAndSetProperty("cache_data", "test.cache.data");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    createDirAndSetProperty("hadoop_tmp", "hadoop.tmp.dir");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    hadoopLogDir = createDirAndSetProperty("hadoop_logs", "hadoop.log.dir");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    createDirAndSetProperty("mapred_local", "mapreduce.cluster.local.dir");<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    createDirAndSetProperty("mapred_temp", "mapreduce.cluster.temp.dir");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    enableShortCircuit();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Path root = getDataTestDirOnTestFS("hadoop");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    conf.set(MapreduceTestingShim.getMROutputDirProp(),<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      new Path(root, "mapred-output-dir").toString());<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set("mapreduce.jobtracker.staging.root.dir",<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    conf.set("yarn.app.mapreduce.am.staging-dir",<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      new Path(root, "mapreduce-am-staging-root-dir").toString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * at which point they will switch to using mini DFS for storage.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   */<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public HBaseTestingUtility() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   *<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   *<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * at which point they will switch to using mini DFS for storage.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param conf The configuration to use for further operations<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    super(conf);<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Save this for when setting default file:// breaks things<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Every cluster is a local cluster until we start DFS<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Note that conf could be null, but this.conf will not be<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String dataTestDir = getDataTestDir().toString();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // tests opt-out for random port assignment<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, 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>  /**<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @return a normal HBaseTestingUtility<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Deprecated<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return a normal HBaseTestingUtility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Deprecated<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new HBaseTestingUtility(c);<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>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    closeRegionAndWAL((HRegion)r);<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>  /**<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (r == null) return;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    r.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (r.getWAL() == null) return;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    r.getWAL().close();<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>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * make a copy and use that.  Do<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * @return Instance of Configuration.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public Configuration getConfiguration() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return super.getConfiguration();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Give it a random name so can have many concurrent tests running if<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * System property, as it's what minidfscluster bases<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * instances -- another instance could grab the temporary<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * single instance only is how the minidfscluster works.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * We also create the underlying directory for<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   *<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return The calculated data test build directory, if newly-created.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  protected Path setupDataTestDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Path testPath = super.setupDataTestDir();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (null == testPath) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      "hadoop.log.dir",<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      testPath, "hadoop-log-dir");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    createSubDirAndSystemProperty(<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      "hadoop.tmp.dir",<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      testPath, "hadoop-tmp-dir");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    createSubDir(<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      "mapreduce.cluster.local.dir",<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      testPath, "mapred-local-dir");<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    String propertyName, Path parent, String subDirName){<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String sysValue = System.getProperty(propertyName);<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (sysValue != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // There is already a value set. So we do nothing but hope<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      //  that there will be no conflicts<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String confValue = conf.get(propertyName);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.465"></a>
+<span class="sourceLineNo">466</span>       LOG.warn(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>         propertyName + " property value differs in configuration and system: "+<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      createSubDir(propertyName, parent, subDirName);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      System.setProperty(propertyName, conf.get(propertyName));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<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>  /**<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * for the test filesystem by default<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #setupDataTestDirOnTestFS()<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see #getTestFileSystem()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    FileSystem fs = getTestFileSystem();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>   * @return META table descriptor<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  @Deprecated<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>   * @return META table descriptor<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    } catch (IOException e) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  /**<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * if the test relies on it.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a unique path in the test filesystem<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   */<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    if (dataTestDirOnTestFS == null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * if the test relies on it.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @return a unique path in the test filesystem<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.534"></a>
+<span class="s

<TRUNCATED>

[28/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 4daf6ee..03f4a8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -1174,7 +1174,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>init</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.671">init</a>(int&nbsp;numThreads,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.669">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.
@@ -1198,7 +1198,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startWorkers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.716">startWorkers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.714">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>
@@ -1213,7 +1213,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.735">stop</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.733">stop</a>()</pre>
 </li>
 </ul>
 <a name="join--">
@@ -1222,7 +1222,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.746">join</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.744">join</a>()</pre>
 </li>
 </ul>
 <a name="refreshConfiguration-org.apache.hadoop.conf.Configuration-">
@@ -1231,7 +1231,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.777">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.775">refreshConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 </li>
 </ul>
 <a name="isRunning--">
@@ -1240,7 +1240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRunning</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.786">isRunning</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.784">isRunning</a>()</pre>
 </li>
 </ul>
 <a name="getWorkerThreadCount--">
@@ -1249,7 +1249,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getWorkerThreadCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.793">getWorkerThreadCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.791">getWorkerThreadCount</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the current number of worker threads.</dd>
@@ -1262,7 +1262,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCorePoolSize</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.800">getCorePoolSize</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.798">getCorePoolSize</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the core pool size settings.</dd>
@@ -1275,7 +1275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveExecutorCount</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.804">getActiveExecutorCount</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.802">getActiveExecutorCount</a>()</pre>
 </li>
 </ul>
 <a name="getEnvironment--">
@@ -1284,7 +1284,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getEnvironment</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.808">getEnvironment</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.806">getEnvironment</a>()</pre>
 </li>
 </ul>
 <a name="getStore--">
@@ -1293,7 +1293,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStore</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.812">getStore</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.810">getStore</a>()</pre>
 </li>
 </ul>
 <a name="getScheduler--">
@@ -1302,7 +1302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getScheduler</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.816">getScheduler</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.814">getScheduler</a>()</pre>
 </li>
 </ul>
 <a name="setKeepAliveTime-long-java.util.concurrent.TimeUnit-">
@@ -1311,7 +1311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setKeepAliveTime</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.820">setKeepAliveTime</a>(long&nbsp;keepAliveTime,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.818">setKeepAliveTime</a>(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)</pre>
 </li>
 </ul>
@@ -1321,7 +1321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getKeepAliveTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.825">getKeepAliveTime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;timeUnit)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.823">getKeepAliveTime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/TimeUnit.html?is-external=true" title="class or interface in java.util.concurrent">TimeUnit</a>&nbsp;timeUnit)</pre>
 </li>
 </ul>
 <a name="addChore-org.apache.hadoop.hbase.procedure2.ProcedureInMemoryChore-">
@@ -1330,7 +1330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addChore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.837">addChore</a>(<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)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.835">addChore</a>(<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)</pre>
 <div class="block">Add a chore procedure to the executor</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1344,7 +1344,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeChore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.847">removeChore</a>(<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)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.845">removeChore</a>(<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)</pre>
 <div class="block">Remove a chore procedure from the executor</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1360,7 +1360,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createNonceKey</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.861">createNonceKey</a>(long&nbsp;nonceGroup,
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.859">createNonceKey</a>(long&nbsp;nonceGroup,
                                long&nbsp;nonce)</pre>
 <div class="block">Create a NoneKey from the specified nonceGroup and nonce.</div>
 <dl>
@@ -1378,7 +1378,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>registerNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.876">registerNonce</a>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.874">registerNonce</a>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</pre>
 <div class="block">Register a nonce for a procedure that is going to be submitted.
  A procId will be reserved and on submitProcedure(),
  the procedure with the specified nonce will take the reserved ProcId.
@@ -1399,7 +1399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterNonceIfProcedureWasNotSubmitted</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.907">unregisterNonceIfProcedureWasNotSubmitted</a>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.905">unregisterNonceIfProcedureWasNotSubmitted</a>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</pre>
 <div class="block">Remove the NonceKey if the procedure was not submitted to the executor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1413,7 +1413,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setFailureResultForNonce</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.981">setFailureResultForNonce</a>(<a href="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.979">setFailureResultForNonce</a>(<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,
                                      <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;procOwner,
                                      <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>&nbsp;exception)</pre>
@@ -1434,7 +1434,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>submitProcedure</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1006">submitProcedure</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>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1004">submitProcedure</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>
 <div class="block">Add a new root-procedure to the executor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1450,7 +1450,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bypassProcedure</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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1045">bypassProcedure</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="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;pids,
+<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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1043">bypassProcedure</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="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;pids,
                                      long&nbsp;lockWait,
                                      boolean&nbsp;force,
                                      boolean&nbsp;recursive)
@@ -1501,7 +1501,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bypassProcedure</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1055">bypassProcedure</a>(long&nbsp;pid,
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1053">bypassProcedure</a>(long&nbsp;pid,
                         long&nbsp;lockWait,
                         boolean&nbsp;override,
                         boolean&nbsp;recursive)
@@ -1518,7 +1518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>submitProcedure</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1162">submitProcedure</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>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1160">submitProcedure</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="../../../../../org/apache/hadoop/hbase/util/NonceKey.html" title="class in org.apache.hadoop.hbase.util">NonceKey</a>&nbsp;nonceKey)</pre>
 <div class="block">Add a new root-procedure to the executor.</div>
 <dl>
@@ -1536,7 +1536,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>submitProcedures</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1193">submitProcedures</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;procs)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1191">submitProcedures</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;procs)</pre>
 <div class="block">Add a set of new root-procedure to the executor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1550,7 +1550,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareProcedure</h4>
-<pre>private&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;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1216">prepareProcedure</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>
+<pre>private&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;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1214">prepareProcedure</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>
 </li>
 </ul>
 <a name="pushProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1559,7 +1559,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>pushProcedure</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1225">pushProcedure</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>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1223">pushProcedure</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>
 </li>
 </ul>
 <a name="abort-long-">
@@ -1568,7 +1568,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1249">abort</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1247">abort</a>(long&nbsp;procId)</pre>
 <div class="block">Send an abort notification the specified procedure.
  Depending on the procedure implementation the abort can be considered or ignored.</div>
 <dl>
@@ -1585,7 +1585,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1260">abort</a>(long&nbsp;procId,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1258">abort</a>(long&nbsp;procId,
                      boolean&nbsp;mayInterruptIfRunning)</pre>
 <div class="block">Send an abort notification to the specified procedure.
  Depending on the procedure implementation, the abort can be considered or ignored.</div>
@@ -1604,7 +1604,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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1274">getProcedure</a>(long&nbsp;procId)</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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1272">getProcedure</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="getProcedure-java.lang.Class-long-">
@@ -1613,7 +1613,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;&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;&nbsp;T&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1278">getProcedure</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;T&gt;&nbsp;clazz,
+<pre>public&nbsp;&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;&nbsp;T&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1276">getProcedure</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;T&gt;&nbsp;clazz,
                                                           long&nbsp;procId)</pre>
 </li>
 </ul>
@@ -1623,7 +1623,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getResult</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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1286">getResult</a>(long&nbsp;procId)</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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1284">getResult</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isFinished-long-">
@@ -1632,7 +1632,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isFinished</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1302">isFinished</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1300">isFinished</a>(long&nbsp;procId)</pre>
 <div class="block">Return true if the procedure is finished.
  The state may be "completed successfully" or "failed and rolledback".
  Use getResult() to check the state or get the result data.</div>
@@ -1650,7 +1650,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isStarted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1311">isStarted</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1309">isStarted</a>(long&nbsp;procId)</pre>
 <div class="block">Return true if the procedure is started.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1666,7 +1666,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>removeResult</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1323">removeResult</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1321">removeResult</a>(long&nbsp;procId)</pre>
 <div class="block">Mark the specified completed procedure, as ready to remove.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1680,7 +1680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getResultOrProcedure</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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1335">getResultOrProcedure</a>(long&nbsp;procId)</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.html" title="type parameter in ProcedureExecutor">TEnvironment</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1333">getResultOrProcedure</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="isProcedureOwner-long-org.apache.hadoop.hbase.security.User-">
@@ -1689,7 +1689,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isProcedureOwner</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1351">isProcedureOwner</a>(long&nbsp;procId,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1349">isProcedureOwner</a>(long&nbsp;procId,
                                 <a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)</pre>
 <div class="block">Check if the user is this procedure's owner</div>
 <dl>
@@ -1708,7 +1708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveProceduresNoCopy</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1377">getActiveProceduresNoCopy</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1375">getActiveProceduresNoCopy</a>()</pre>
 <div class="block">Should only be used when starting up, where the procedure workers have not been started.
  <p/>
  If the procedure works has been started, the return values maybe changed when you are
@@ -1722,7 +1722,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcedures</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/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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1385">getProcedures</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/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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1383">getProcedures</a>()</pre>
 <div class="block">Get procedures.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -1736,7 +1736,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>registerListener</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1401">registerListener</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1399">registerListener</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</pre>
 </li>
 </ul>
 <a name="unregisterListener-org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener-">
@@ -1745,7 +1745,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>unregisterListener</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1405">unregisterListener</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1403">unregisterListener</a>(<a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureExecutor.ProcedureExecutorListener.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureExecutor.ProcedureExecutorListener</a>&nbsp;listener)</pre>
 </li>
 </ul>
 <a name="sendProcedureLoadedNotification-long-">
@@ -1754,7 +1754,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sendProcedureLoadedNotification</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1409">sendProcedureLoadedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1407">sendProcedureLoadedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="sendProcedureAddedNotification-long-">
@@ -1763,7 +1763,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sendProcedureAddedNotification</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1421">sendProcedureAddedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1419">sendProcedureAddedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="sendProcedureFinishedNotification-long-">
@@ -1772,7 +1772,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sendProcedureFinishedNotification</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1433">sendProcedureFinishedNotification</a>(long&nbsp;procId)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1431">sendProcedureFinishedNotification</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="nextProcId--">
@@ -1781,7 +1781,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextProcId</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1448">nextProcId</a>()</pre>
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1446">nextProcId</a>()</pre>
 </li>
 </ul>
 <a name="getLastProcId--">
@@ -1790,7 +1790,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastProcId</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1465">getLastProcId</a>()</pre>
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1463">getLastProcId</a>()</pre>
 </li>
 </ul>
 <a name="getActiveProcIds--">
@@ -1799,7 +1799,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getActiveProcIds</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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1470">getActiveProcIds</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="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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1468">getActiveProcIds</a>()</pre>
 </li>
 </ul>
 <a name="getRootProcedureId-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1808,7 +1808,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRootProcedureId</h4>
-<pre><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/procedure2/ProcedureExecutor.html#line.1474">getRootProcedureId</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>
+<pre><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/procedure2/ProcedureExecutor.html#line.1472">getRootProcedureId</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>
 </li>
 </ul>
 <a name="executeProcedure-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1817,7 +1817,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>executeProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1481">executeProcedure</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1479">executeProcedure</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>
 </li>
 </ul>
 <a name="acquireLock-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1826,7 +1826,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>acquireLock</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1577">acquireLock</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>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1575">acquireLock</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>
 </li>
 </ul>
 <a name="releaseLock-org.apache.hadoop.hbase.procedure2.Procedure-boolean-">
@@ -1835,7 +1835,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>releaseLock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1587">releaseLock</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.1585">releaseLock</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,
                          boolean&nbsp;force)</pre>
 </li>
 </ul>
@@ -1845,7 +1845,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>executeRollback</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1600">executeRollback</a>(long&nbsp;rootProcId,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1598">executeRollback</a>(long&nbsp;rootProcId,
                                             <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)</pre>
 <div class="block">Execute the rollback of the full procedure stack. Once the procedure is rolledback, the
  root-procedure will be visible as finished to user, and the result will be the fatal exception.</div>
@@ -1857,7 +1857,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupAfterRollbackOneStep</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1668">cleanupAfterRollbackOneStep</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1666">cleanupAfterRollbackOneStep</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>
 </li>
 </ul>
 <a name="executeRollback-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1866,7 +1866,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>executeRollback</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1698">executeRollback</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>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2">Procedure.LockState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1696">executeRollback</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>
 <div class="block">Execute the rollback of the procedure step.
  It updates the store with the new state (stack index)
  or will remove completly the procedure in case it is a child.</div>
@@ -1878,7 +1878,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>yieldProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1726">yieldProcedure</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1724">yieldProcedure</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>
 </li>
 </ul>
 <a name="execProcedure-org.apache.hadoop.hbase.procedure2.RootProcedureState-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1887,7 +1887,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>execProcedure</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1760">execProcedure</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;&nbsp;procStack,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1758">execProcedure</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;&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)</pre>
 <div class="block">Executes <code>procedure</code>
  <ul>
@@ -1924,7 +1924,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>kill</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1888">kill</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;msg)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1886">kill</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;msg)</pre>
 </li>
 </ul>
 <a name="initializeChildren-org.apache.hadoop.hbase.procedure2.RootProcedureState-org.apache.hadoop.hbase.procedure2.Procedure-org.apache.hadoop.hbase.procedure2.Procedure:A-">
@@ -1933,7 +1933,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>initializeChildren</h4>
-<pre>private&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;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1894">initializeChildren</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;&nbsp;procStack,
+<pre>private&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;[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1892">initializeChildren</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;&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)</pre>
 </li>
@@ -1944,7 +1944,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>submitChildrenProcedures</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1930">submitChildrenProcedures</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;subprocs)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1928">submitChildrenProcedures</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;subprocs)</pre>
 </li>
 </ul>
 <a name="countDownChildren-org.apache.hadoop.hbase.procedure2.RootProcedureState-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1953,7 +1953,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>countDownChildren</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1940">countDownChildren</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;&nbsp;procStack,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1938">countDownChildren</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;&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)</pre>
 </li>
 </ul>
@@ -1963,7 +1963,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateStoreOnExec</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1959">updateStoreOnExec</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;&nbsp;procStack,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1957">updateStoreOnExec</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;&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)</pre>
 </li>
@@ -1974,7 +1974,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>handleInterruptedException</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1985">handleInterruptedException</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.1983">handleInterruptedException</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/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>&nbsp;e)</pre>
 </li>
 </ul>
@@ -1984,7 +1984,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>execCompletionCleanup</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1994">execCompletionCleanup</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.1992">execCompletionCleanup</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>
 </li>
 </ul>
 <a name="procedureFinished-org.apache.hadoop.hbase.procedure2.Procedure-">
@@ -1993,7 +1993,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureFinished</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2011">procedureFinished</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2009">procedureFinished</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>
 </li>
 </ul>
 <a name="getProcStack-long-">
@@ -2002,7 +2002,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getProcStack</h4>
-<pre><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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2038">getProcStack</a>(long&nbsp;rootProcId)</pre>
+<pre><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;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2036">getProcStack</a>(long&nbsp;rootProcId)</pre>
 </li>
 </ul>
 <a name="getProcedureScheduler--">
@@ -2011,7 +2011,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getProcedureScheduler</h4>
-<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2043">getProcedureScheduler</a>()</pre>
+<pre><a href="../../../../../org/apache/hadoop/hbase/procedure2/ProcedureScheduler.html" title="interface in org.apache.hadoop.hbase.procedure2">ProcedureScheduler</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2041">getProcedureScheduler</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 577acd7..3de8cda 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/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/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/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 77af791..0b38cf1 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html
@@ -138,8 +138,8 @@ var activeTableTab = "activeTableTab";
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#isNextFinished--">isNextFinished</a></span>()</code>
-<div class="block">Calling this method does not need to converting the protobuf message to the Procedure class,
- so if it returns true we can call <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>skipNext()</code></a> to skip the procedure without
+<div class="block">Calling this method does not need to convert the protobuf message to the Procedure class, so
+ if it returns true we can call <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>skipNext()</code></a> to skip the procedure without
  deserializing.</div>
 </td>
 </tr>
@@ -212,8 +212,8 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <h4>isNextFinished</h4>
 <pre>boolean&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#line.93">isNextFinished</a>()</pre>
-<div class="block">Calling this method does not need to converting the protobuf message to the Procedure class,
- so if it returns true we can call <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>skipNext()</code></a> to skip the procedure without
+<div class="block">Calling this method does not need to convert the protobuf message to the Procedure class, so
+ if it returns true we can call <a href="../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>skipNext()</code></a> to skip the procedure without
  deserializing. This could increase the performance.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html
index 70c95a1..bdeb212 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html
@@ -195,8 +195,8 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/stor
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html#isNextFinished--">isNextFinished</a></span>()</code>
-<div class="block">Calling this method does not need to converting the protobuf message to the Procedure class,
- so if it returns true we can call <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
+<div class="block">Calling this method does not need to convert the protobuf message to the Procedure class, so
+ if it returns true we can call <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
  deserializing.</div>
 </td>
 </tr>
@@ -350,8 +350,8 @@ implements <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/stor
 <h4>isNextFinished</h4>
 <pre>public&nbsp;boolean&nbsp;<a href="../../../../../../../src-html/org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html#line.256">isNextFinished</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#isNextFinished--">ProcedureStore.ProcedureIterator</a></code></span></div>
-<div class="block">Calling this method does not need to converting the protobuf message to the Procedure class,
- so if it returns true we can call <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
+<div class="block">Calling this method does not need to convert the protobuf message to the Procedure class, so
+ if it returns true we can call <a href="../../../../../../../org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
  deserializing. This could increase the performance.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 958cfdb..9a00666 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -230,12 +230,12 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/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/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/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/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 </ul>
 </li>
 </ul>


[15/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 2945c58..8de499d 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
@@ -93,8 +93,8 @@
 <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>     * Calling this method does not need to converting the protobuf message to the Procedure class,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>     * so if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
+<span class="sourceLineNo">088</span>     * Calling this method does not need to convert the protobuf message to the Procedure class, so<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     * if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
 <span class="sourceLineNo">090</span>     * deserializing. This could increase the performance.<a name="line.90"></a>
 <span class="sourceLineNo">091</span>     * @return true if the iterator next element is a completed procedure.<a name="line.91"></a>
 <span class="sourceLineNo">092</span>     */<a name="line.92"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 2945c58..8de499d 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
@@ -93,8 +93,8 @@
 <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>     * Calling this method does not need to converting the protobuf message to the Procedure class,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>     * so if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
+<span class="sourceLineNo">088</span>     * Calling this method does not need to convert the protobuf message to the Procedure class, so<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     * if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
 <span class="sourceLineNo">090</span>     * deserializing. This could increase the performance.<a name="line.90"></a>
 <span class="sourceLineNo">091</span>     * @return true if the iterator next element is a completed procedure.<a name="line.91"></a>
 <span class="sourceLineNo">092</span>     */<a name="line.92"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 2945c58..8de499d 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
@@ -93,8 +93,8 @@
 <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>     * Calling this method does not need to converting the protobuf message to the Procedure class,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>     * so if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
+<span class="sourceLineNo">088</span>     * Calling this method does not need to convert the protobuf message to the Procedure class, so<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     * if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
 <span class="sourceLineNo">090</span>     * deserializing. This could increase the performance.<a name="line.90"></a>
 <span class="sourceLineNo">091</span>     * @return true if the iterator next element is a completed procedure.<a name="line.91"></a>
 <span class="sourceLineNo">092</span>     */<a name="line.92"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 2945c58..8de499d 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
@@ -93,8 +93,8 @@
 <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>     * Calling this method does not need to converting the protobuf message to the Procedure class,<a name="line.88"></a>
-<span class="sourceLineNo">089</span>     * so if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
+<span class="sourceLineNo">088</span>     * Calling this method does not need to convert the protobuf message to the Procedure class, so<a name="line.88"></a>
+<span class="sourceLineNo">089</span>     * if it returns true we can call {@link #skipNext()} to skip the procedure without<a name="line.89"></a>
 <span class="sourceLineNo">090</span>     * deserializing. This could increase the performance.<a name="line.90"></a>
 <span class="sourceLineNo">091</span>     * @return true if the iterator next element is a completed procedure.<a name="line.91"></a>
 <span class="sourceLineNo">092</span>     */<a name="line.92"></a>


[20/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090

<TRUNCATED>

[27/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index c97436d..5da5c49 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2273">HStore.StoreFlusherImpl</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.html#line.2266">HStore.StoreFlusherImpl</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/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></pre>
 </li>
@@ -279,7 +279,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tracker</h4>
-<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2275">tracker</a></pre>
+<pre>private final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2268">tracker</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSeqNum">
@@ -288,7 +288,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSeqNum</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2276">cacheFlushSeqNum</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2269">cacheFlushSeqNum</a></pre>
 </li>
 </ul>
 <a name="snapshot">
@@ -297,7 +297,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>snapshot</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2277">snapshot</a></pre>
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSnapshot</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2270">snapshot</a></pre>
 </li>
 </ul>
 <a name="tempFiles">
@@ -306,7 +306,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>tempFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2278">tempFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2271">tempFiles</a></pre>
 </li>
 </ul>
 <a name="committedFiles">
@@ -315,7 +315,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>committedFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2279">committedFiles</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;org.apache.hadoop.fs.Path&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2272">committedFiles</a></pre>
 </li>
 </ul>
 <a name="cacheFlushCount">
@@ -324,7 +324,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushCount</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2280">cacheFlushCount</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2273">cacheFlushCount</a></pre>
 </li>
 </ul>
 <a name="cacheFlushSize">
@@ -333,7 +333,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheFlushSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2281">cacheFlushSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2274">cacheFlushSize</a></pre>
 </li>
 </ul>
 <a name="outputFileSize">
@@ -342,7 +342,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>outputFileSize</h4>
-<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2282">outputFileSize</a></pre>
+<pre>private&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2275">outputFileSize</a></pre>
 </li>
 </ul>
 </li>
@@ -359,7 +359,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>StoreFlusherImpl</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2284">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2277">StoreFlusherImpl</a>(long&nbsp;cacheFlushSeqNum,
                          <a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
@@ -377,7 +377,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>prepare</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2294">prepare</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreSize.html" title="class in org.apache.hadoop.hbase.regionserver">MemStoreSize</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2287">prepare</a>()</pre>
 <div class="block">This is not thread safe. The caller should have a lock on the region or the store.
  If necessary, the lock can be added with the patch provided in HBASE-10087</div>
 <dl>
@@ -394,7 +394,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCache</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2304">flushCache</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2297">flushCache</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></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#flushCache-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Flush the cache (create the new store file)
@@ -415,7 +415,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>commit</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2313">commit</a>(<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.html" title="interface in org.apache.hadoop.hbase.monitoring">MonitoredTask</a>&nbsp;status)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2306">commit</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></pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#commit-org.apache.hadoop.hbase.monitoring.MonitoredTask-">StoreFlushContext</a></code></span></div>
 <div class="block">Commit the flush - add the store file to the store and clear the
@@ -440,7 +440,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getOutputFileSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2356">getOutputFileSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2349">getOutputFileSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getOutputFileSize--">getOutputFileSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html" title="interface in org.apache.hadoop.hbase.regionserver">StoreFlushContext</a></code></dd>
@@ -455,7 +455,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>getCommittedFiles</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;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2361">getCommittedFiles</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;org.apache.hadoop.fs.Path&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2354">getCommittedFiles</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlushContext.html#getCommittedFiles--">StoreFlushContext</a></code></span></div>
 <div class="block">Returns the newly committed files from the flush. Called only if commit returns true</div>
 <dl>
@@ -472,7 +472,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockList">
 <li class="blockList">
 <h4>replayFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2374">replayFlush</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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2367">replayFlush</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="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;fileNames,
                         boolean&nbsp;dropMemstoreSnapshot)
                  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">Similar to commit, but called in secondary region replicas for replaying the
@@ -495,7 +495,7 @@ implements <a href="../../../../../org/apache/hadoop/hbase/regionserver/StoreFlu
 <ul class="blockListLast">
 <li class="blockList">
 <h4>abort</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2406">abort</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html#line.2399">abort</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">Abort the snapshot preparation. Drops the snapshot if any.</div>
 <dl>


[13/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
index 5b9d987..b595018 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.html
@@ -310,2495 +310,2488 @@
 <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>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    this.checksumType = getChecksumType(conf);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Initialize bytes per checksum<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    flushRetriesNumber = conf.getInt(<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throw new IllegalArgumentException(<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              + flushRetriesNumber);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    int confPrintThreshold =<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (confPrintThreshold &lt; 10) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
+<span class="sourceLineNo">305</span>    List&lt;HStoreFile&gt; hStoreFiles = loadStoreFiles();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // Move the storeSize calculation out of loadStoreFiles() method, because the secondary read<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // replica's refreshStoreFiles() will also use loadStoreFiles() to refresh its store files and<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // update the storeSize in the completeCompaction(..) finally (just like compaction) , so<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // no need calculate the storeSize twice.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    this.storeSize.addAndGet(getStorefilesSize(hStoreFiles, sf -&gt; true));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    this.totalUncompressedBytes.addAndGet(getTotalUmcompressedBytes(hStoreFiles));<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.storeEngine.getStoreFileManager().loadFiles(hStoreFiles);<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this.checksumType = getChecksumType(conf);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    // Initialize bytes per checksum<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    flushRetriesNumber = conf.getInt(<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      throw new IllegalArgumentException(<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.323"></a>
+<span class="sourceLineNo">324</span>              + flushRetriesNumber);<a name="line.324"></a>
 <span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        family.getCompressionType());<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>   * @return MemStore Instance to use in this store.<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private MemStore getMemstore() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    MemStore ms = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (this.getTableName().isSystemTable()) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    } else {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    if (inMemoryCompaction == null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      inMemoryCompaction =<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    switch (inMemoryCompaction) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      case NONE:<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            new Object[] { conf, this.comparator,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        break;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      default:<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    return ms;<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>   * Creates the cache config.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * @param family The current column family.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<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>   * Creates the store engine configured for the given Store.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   *              being passed to coprocessors via the compactor.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param conf Store configuration.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @return StoreEngine to use.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      CellComparator kvComparator) throws IOException {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    return StoreEngine.create(store, conf, comparator);<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>   * @param family<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return TTL in seconds of the specified family<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    long ttl = family.getTimeToLive();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (ttl == HConstants.FOREVER) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      // Default is unlimited ttl.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    } else if (ttl == -1) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ttl = Long.MAX_VALUE;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      // Second -&gt; ms adjust for user data<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      ttl *= 1000;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return ttl;<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>  @Override<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public String getColumnFamilyName() {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    return this.family.getNameAsString();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public TableName getTableName() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return this.getRegionInfo().getTable();<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>  @Override<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public FileSystem getFileSystem() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.fs.getFileSystem();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return this.fs;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  /* Implementation of StoreConfigInformation */<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public long getStoreFileTtl() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<a name="line.430"></a>
+<span class="sourceLineNo">326</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    int confPrintThreshold =<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (confPrintThreshold &lt; 10) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      confPrintThreshold = 10;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.334"></a>
+<span class="sourceLineNo">335</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        family.getCompressionType());<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>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @return MemStore Instance to use in this store.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private MemStore getMemstore() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    MemStore ms = null;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (this.getTableName().isSystemTable()) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    } else {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (inMemoryCompaction == null) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      inMemoryCompaction =<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    switch (inMemoryCompaction) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      case NONE:<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            new Object[] { conf, this.comparator,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        break;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      default:<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return ms;<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>  /**<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * Creates the cache config.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @param family The current column family.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    this.cacheConf = new CacheConfig(conf, family);<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>   * Creates the store engine configured for the given Store.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   *              being passed to coprocessors via the compactor.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @param conf Store configuration.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @return StoreEngine to use.<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      CellComparator kvComparator) throws IOException {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    return StoreEngine.create(store, conf, comparator);<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>   * @param family<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @return TTL in seconds of the specified family<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    long ttl = family.getTimeToLive();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (ttl == HConstants.FOREVER) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      // Default is unlimited ttl.<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      ttl = Long.MAX_VALUE;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    } else if (ttl == -1) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      ttl = Long.MAX_VALUE;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    } else {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Second -&gt; ms adjust for user data<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      ttl *= 1000;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return ttl;<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>  @Override<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public String getColumnFamilyName() {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return this.family.getNameAsString();<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public TableName getTableName() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return this.getRegionInfo().getTable();<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>  @Override<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public FileSystem getFileSystem() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return this.fs.getFileSystem();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return this.fs;<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>  @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public long getMemStoreFlushSize() {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    return this.region.memstoreFlushSize;<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 MemStoreSize getFlushableSize() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return this.memstore.getFlushableSize();<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 MemStoreSize getSnapshotSize() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.memstore.getSnapshotSize();<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>  @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  public long getCompactionCheckMultiplier() {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  public long getBlockingFileCount() {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    return blockingFileCount;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @param conf The configuration<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.466"></a>
-<span class="sourceLineNo">467</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>  /**<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * Returns the configured checksum algorithm.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @param conf The configuration<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * @return The checksum algorithm that is set in the configuration<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    if (checksumName == null) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return ChecksumType.getDefaultChecksumType();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      return ChecksumType.nameToType(checksumName);<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><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /**<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @return how many bytes to write between status checks<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public static int getCloseCheckInterval() {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    return closeCheckInterval;<a name="line.488"></a>
+<span class="sourceLineNo">433</span>  /* Implementation of StoreConfigInformation */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public long getStoreFileTtl() {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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 long getMemStoreFlushSize() {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return this.region.memstoreFlushSize;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public MemStoreSize getFlushableSize() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public MemStoreSize getSnapshotSize() {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    return this.memstore.getSnapshotSize();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public long getCompactionCheckMultiplier() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public long getBlockingFileCount() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    return blockingFileCount;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /* End implementation of StoreConfigInformation */<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Returns the configured bytesPerChecksum value.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @param conf The configuration<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.473"></a>
+<span class="sourceLineNo">474</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<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>  /**<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * Returns the configured checksum algorithm.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param conf The configuration<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @return The checksum algorithm that is set in the configuration<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    if (checksumName == null) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return ChecksumType.getDefaultChecksumType();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    } else {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      return ChecksumType.nameToType(checksumName);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
 <span class="sourceLineNo">489</span>  }<a name="line.489"></a>
 <span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return this.family;<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 OptionalLong getMaxSequenceId() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<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>  @Override<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @param hri {@link RegionInfo} for the region.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.509"></a>
-<span class="sourceLineNo">510</span>   * @return Path to family/Store home directory.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>   */<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Deprecated<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      final RegionInfo hri, final byte[] family) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param encodedName Encoded region name.<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @return Path to family/Store home directory.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  @Deprecated<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      final String encodedName, final byte[] family) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
-<span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return the data block encoder<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return dataBlockEncoder;<a name="line.534"></a>
+<span class="sourceLineNo">491</span>  /**<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @return how many bytes to write between status checks<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   */<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public static int getCloseCheckInterval() {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return closeCheckInterval;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return this.family;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public OptionalLong getMaxSequenceId() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>  }<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>  @Override<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * @param hri {@link RegionInfo} for the region.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * @return Path to family/Store home directory.<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  @Deprecated<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      final RegionInfo hri, final byte[] family) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  /**<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * @param encodedName Encoded region name.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * @return Path to family/Store home directory.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  @Deprecated<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      final String encodedName, final byte[] family) {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.534"></a>
 <span class="sourceLineNo">535</span>  }<a name="line.535"></a>
 <span class="sourceLineNo">536</span><a name="line.536"></a>
 <span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * Should be used only in tests.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * @param blockEncoder the block delta encoder to use<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   */<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    this.dataBlockEncoder = blockEncoder;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  /**<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * from the given directory.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @throws IOException<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    return openStoreFiles(files);<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>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      return Collections.emptyList();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    // initialize the thread pool for opening store files in parallel..<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    int totalValidStoreFile = 0;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      // open each store file in parallel<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      totalValidStoreFile++;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
+<span class="sourceLineNo">538</span>   * @return the data block encoder<a name="line.538"></a>
+<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    return dataBlockEncoder;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>  /**<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * Should be used only in tests.<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @param blockEncoder the block delta encoder to use<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   */<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    this.dataBlockEncoder = blockEncoder;<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * from the given directory.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   * @throws IOException<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   */<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return openStoreFiles(files);<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>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      return Collections.emptyList();<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    // initialize the thread pool for opening store files in parallel..<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    IOException ioe = null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    try {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          HStoreFile storeFile = completionService.take().get();<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          if (storeFile != null) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            long length = storeFile.getReader().length();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            this.storeSize.addAndGet(length);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            this.totalUncompressedBytes<a name="line.581"></a>
-<span class="sourceLineNo">582</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            LOG.debug("loaded {}", storeFile);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            results.add(storeFile);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        } catch (InterruptedException e) {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        } catch (ExecutionException e) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>        }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    } finally {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    if (ioe != null) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      // close StoreFile readers<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      boolean evictOnClose =<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      for (HStoreFile file : results) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (file != null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            file.closeStoreFile(evictOnClose);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>          }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (IOException e) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<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>    return results;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">572</span>    int totalValidStoreFile = 0;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      // open each store file in parallel<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      totalValidStoreFile++;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    }<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    IOException ioe = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    try {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        try {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          HStoreFile storeFile = completionService.take().get();<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          if (storeFile != null) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>            LOG.debug("loaded {}", storeFile);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>            results.add(storeFile);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        } catch (InterruptedException e) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        } catch (ExecutionException e) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    } finally {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    }<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    if (ioe != null) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // close StoreFile readers<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      boolean evictOnClose =<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      for (HStoreFile file : results) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        try {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          if (file != null) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>            file.closeStoreFile(evictOnClose);<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          }<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        } catch (IOException e) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
 <span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Override<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void refreshStoreFiles() throws IOException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    refreshStoreFilesInternal(newFiles);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  /**<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * region replicas to keep up to date with the primary region files.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * @throws IOException<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    for (String file : newFiles) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    refreshStoreFilesInternal(storeFiles);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>  }<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>  /**<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * been opened, and removes the store file readers for store files no longer<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * the primary region files.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @throws IOException<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for (HStoreFile sf : currentFiles) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HStoreFile sf : compactedFiles) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Exclude the files that have already been compacted<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      return;<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>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.668"></a>
+<span class="sourceLineNo">614</span>    return results;<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>  @Override<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public void refreshStoreFiles() throws IOException {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    refreshStoreFilesInternal(newFiles);<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * region replicas to keep up to date with the primary region files.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * @throws IOException<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    for (String file : newFiles) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    refreshStoreFilesInternal(storeFiles);<a name="line.633"></a>
+<span class="sourceLineNo">634</span>  }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>  /**<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * been opened, and removes the store file readers for store files no longer<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * the primary region files.<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * @throws IOException<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   */<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    for (HStoreFile sf : currentFiles) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    for (HStoreFile sf : compactedFiles) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    // Exclude the files that have already been compacted<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      return;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    // try to open the files<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.676"></a>
+<span class="sourceLineNo">670</span>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<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>    // propogate the file changes to the underlying store file manager<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.679"></a>
+<span class="sourceLineNo">678</span>    // try to open the files<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.679"></a>
 <span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    // in-flight transactions might be made visible)<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      // we must have the max sequence id here as we do have several store files<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<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>    completeCompaction(toBeRemovedStoreFiles);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
+<span class="sourceLineNo">681</span>    // propogate the file changes to the underlying store file manager<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    // in-flight transactions might be made visible)<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      // we must have the max sequence id here as we do have several store files<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<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>  protected HStoreFile createStoreFileAndReader(final Path p) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    StoreFileInfo info = new StoreFileInfo(conf, this.getFileSystem(), p);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return createStoreFileAndReader(info);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  private HStoreFile createStoreFileAndReader(StoreFileInfo info) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    info.setRegionCoprocessorHost(this.region.getCoprocessorHost());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    HStoreFile storeFile = new HStoreFile(this.getFileSystem(), info, this.conf, this.cacheConf,<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        this.family.getBloomFilterType(), isPrimaryReplicaStore());<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    storeFile.initReader();<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return storeFile;<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>  /**<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   * This message intends to inform the MemStore that next coming updates<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * are going to be part of the replaying edits from WAL<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   */<a name="line.709"></a>
-<span class="sourceLineNo">710</span>  public void startReplayingFromWAL(){<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    this.memstore.startReplayingFromWAL();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<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>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * are done<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public void stopReplayingFromWAL(){<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    this.memstore.stopReplayingFromWAL();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  /**<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   * Adds a value to the memstore<a name="line.723"></a>
-<span class="sourceLineNo">724</span>   */<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  public void add(final Cell cell, MemStoreSizing memstoreSizing) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    lock.readLock().lock();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    try {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.729"></a>
-<span class="sourceLineNo">730</span>          "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      this.memstore.add(cell, memstoreSizing);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    } finally {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      lock.readLock().unlock();<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      currentParallelPutCount.decrementAndGet();<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<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>   * Adds the specified value to the memstore<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  public void add(final Iterable&lt;Cell&gt; cells, MemStoreSizing memstoreSizing) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    lock.readLock().lock();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    try {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.746"></a>
-<span class="sourceLineNo">747</span>            "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      memstore.add(cells, memstoreSizing);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      lock.readLock().unlock();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      currentParallelPutCount.decrementAndGet();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  public long timeOfOldestEdit() {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    return memstore.timeOfOldestEdit();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  }<a name="line.759"></a>
-<span class="sourceLineNo">760</span><a name="line.760"></a>
-<span class="sourceLineNo">761</span>  /**<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   * @return All store files.<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  @Override<a name="line.764"></a>
-<span class="sourceLineNo">765</span>  public Collection&lt;HStoreFile&gt; getStorefiles() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    return this.storeEngine.getStoreFileManager().getStorefiles();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>  @Override<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  public Collection&lt;HStoreFile&gt; getCompactedFiles() {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    return this.storeEngine.getStoreFileManager().getCompactedfiles();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * This throws a WrongRegionException if the HFile does not fit in this region, or an<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   * InvalidHFileException if the HFile is not valid.<a name="line.776"></a>
-<span class="sourceLineNo">777</span>   */<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public void assertBulkLoadHFileOk(Path srcPath) throws IOException {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    HFile.Reader reader  = null;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    try {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      LOG.info("Validating hfile at " + srcPath + " for inclusion in "<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          + "store " + this + " region " + this.getRegionInfo().getRegionNameAsString());<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      reader = HFile.createReader(srcPath.getFileSystem(conf), srcPath, cacheConf,<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        isPrimaryReplicaStore(), conf);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      reader.loadFileInfo();<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>      Optional&lt;byte[]&gt; firstKey = reader.getFirstRowKey();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      Preconditions.checkState(firstKey.isPresent(), "First key can not be null");<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Optional&lt;Cell&gt; lk = reader.getLastKey();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      Preconditions.checkState(lk.isPresent(), "Last key can not be null");<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      byte[] lastKey =  CellUtil.cloneRow(lk.get());<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>      if (LOG.isDebugEnabled()) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        LOG.debug("HFile bounds: first=" + Bytes.toStringBinary(firstKey.get()) +<a name="line.794"></a>
-<span class="sourceLineNo">795</span>            " last=" + Bytes.toStringBinary(lastKey));<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        LOG.debug("Region bounds: first=" +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>            Bytes.toStringBinary(getRegionInfo().getStartKey()) +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>            " last=" + Bytes.toStringBinary(getRegionInfo().getEndKey()));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      }<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>      if (!this.getRegionInfo().containsRange(firstKey.get(), lastKey)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        throw new WrongRegionException(<a name="line.802"></a>
-<span class="sourceLineNo">803</span>            "Bulk load file " + srcPath.toString() + " does not fit inside region "<a name="line.803"></a>
-<span class="sourceLineNo">804</span>            + this.getRegionInfo().getRegionNameAsString());<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if(reader.length() &gt; conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          HConstants.DEFAULT_MAX_FILE_SIZE)) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>        LOG.warn("Trying to bulk load hfile " + srcPath + " with size: " +<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            reader.length() + " bytes can be problematic as it may lead to oversplitting.");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>      if (verifyBulkLoads) {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>        long verificationStartTime = EnvironmentEdgeManager.currentTime();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>        LOG.info("Full verification started for bulk load hfile: {}", srcPath);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        Cell prevCell = null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        HFileScanner scanner = reader.getScanner(false, false, false);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        scanner.seekTo();<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        do {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          Cell cell = scanner.getCell();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          if (prevCell != null) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>            if (comparator.compareRows(prevCell, cell) &gt; 0) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>              throw new InvalidHFileException("Previous row is greater than"<a name="line.823"></a>
-<span class="sourceLineNo">824</span>                  + " current row: path=" + srcPath + " previous="<a name="line.824"></a>
-<span class="sourceLineNo">825</span>                  + CellUtil.getCellKeyAsString(prevCell) + " current="<a name="line.825"></a>
-<span class="sourceLineNo">826</span>                  + CellUtil.getCellKeyAsString(cell));<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            }<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            if (CellComparator.getInstance().compareFamilies(prevCell, cell) != 0) {<a name="line.828"></a>
-<span class="sourceLineNo">829<

<TRUNCATED>

[11/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html b/testapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
index 1add55f..6f5aed0 100644
--- a/testapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
+++ b/testapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
@@ -120,7 +120,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.178">HBaseTestingUtility</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.177">HBaseTestingUtility</a>
 extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a></pre>
 <div class="block">Facility for testing HBase. Replacement for
  old HBaseTestCase and HBaseClusterTestCase functionality.
@@ -136,8 +136,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
  region-server-port are overridden such that a random port will be assigned (thus
  avoiding port contention if another local HBase instance is already running).
  <p>To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"
- setting it to true.
- Trigger pre commit.</div>
+ setting it to true.</div>
 </li>
 </ul>
 </div>
@@ -1831,7 +1830,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>REGIONS_PER_SERVER_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/HBaseTestingUtility.html#line.189">REGIONS_PER_SERVER_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/HBaseTestingUtility.html#line.188">REGIONS_PER_SERVER_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.REGIONS_PER_SERVER_KEY">Constant Field Values</a></dd>
@@ -1844,7 +1843,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGIONS_PER_SERVER</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.194">DEFAULT_REGIONS_PER_SERVER</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.193">DEFAULT_REGIONS_PER_SERVER</a></pre>
 <div class="block">The default number of regions per regionserver when creating a pre-split
  table.</div>
 <dl>
@@ -1859,7 +1858,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>PRESPLIT_TEST_TABLE_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/HBaseTestingUtility.html#line.197">PRESPLIT_TEST_TABLE_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/HBaseTestingUtility.html#line.196">PRESPLIT_TEST_TABLE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PRESPLIT_TEST_TABLE_KEY">Constant Field Values</a></dd>
@@ -1872,7 +1871,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>PRESPLIT_TEST_TABLE</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.198">PRESPLIT_TEST_TABLE</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.197">PRESPLIT_TEST_TABLE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PRESPLIT_TEST_TABLE">Constant Field Values</a></dd>
@@ -1885,7 +1884,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>MEMSTORETS_TAGS_PARAMETRIZED</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.223">MEMSTORETS_TAGS_PARAMETRIZED</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.222">MEMSTORETS_TAGS_PARAMETRIZED</a></pre>
 <div class="block">This is for unit tests parameterized with a single boolean.</div>
 </li>
 </ul>
@@ -1895,7 +1894,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>BLOOM_AND_COMPRESSION_COMBINATIONS</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.299">BLOOM_AND_COMPRESSION_COMBINATIONS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.298">BLOOM_AND_COMPRESSION_COMBINATIONS</a></pre>
 </li>
 </ul>
 <a name="fam1">
@@ -1904,7 +1903,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>fam1</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1827">fam1</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1826">fam1</a></pre>
 </li>
 </ul>
 <a name="fam2">
@@ -1913,7 +1912,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>fam2</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1828">fam2</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1827">fam2</a></pre>
 </li>
 </ul>
 <a name="fam3">
@@ -1922,7 +1921,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>fam3</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1829">fam3</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1828">fam3</a></pre>
 </li>
 </ul>
 <a name="COLUMNS">
@@ -1931,7 +1930,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>COLUMNS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1830">COLUMNS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1829">COLUMNS</a></pre>
 </li>
 </ul>
 <a name="FIRST_CHAR">
@@ -1940,7 +1939,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>FIRST_CHAR</h4>
-<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1833">FIRST_CHAR</a></pre>
+<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1832">FIRST_CHAR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.FIRST_CHAR">Constant Field Values</a></dd>
@@ -1953,7 +1952,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>LAST_CHAR</h4>
-<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1834">LAST_CHAR</a></pre>
+<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1833">LAST_CHAR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.LAST_CHAR">Constant Field Values</a></dd>
@@ -1966,7 +1965,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>START_KEY_BYTES</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1835">START_KEY_BYTES</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1834">START_KEY_BYTES</a></pre>
 </li>
 </ul>
 <a name="START_KEY">
@@ -1975,7 +1974,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>START_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/HBaseTestingUtility.html#line.1836">START_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/HBaseTestingUtility.html#line.1835">START_KEY</a></pre>
 </li>
 </ul>
 <a name="ROWS">
@@ -1984,7 +1983,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>ROWS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2391">ROWS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2390">ROWS</a></pre>
 <div class="block">All the row values for the data loaded by <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#loadTable-org.apache.hadoop.hbase.client.Table-byte:A-"><code>loadTable(Table, byte[])</code></a></div>
 </li>
 </ul>
@@ -1994,7 +1993,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>KEYS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2406">KEYS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2405">KEYS</a></pre>
 </li>
 </ul>
 <a name="KEYS_FOR_HBA_CREATE_TABLE">
@@ -2003,7 +2002,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>KEYS_FOR_HBA_CREATE_TABLE</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2418">KEYS_FOR_HBA_CREATE_TABLE</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2417">KEYS_FOR_HBA_CREATE_TABLE</a></pre>
 </li>
 </ul>
 </li>
@@ -2020,7 +2019,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>HBaseTestingUtility</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.315">HBaseTestingUtility</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.314">HBaseTestingUtility</a>()</pre>
 <div class="block"><p>Create an HBaseTestingUtility using a default configuration.
 
  <p>Initially, all tmp files are written to a local test data directory.
@@ -2039,7 +2038,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HBaseTestingUtility</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.333">HBaseTestingUtility</a>(@Nullable
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.332">HBaseTestingUtility</a>(@Nullable
                            org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><p>Create an HBaseTestingUtility using a given configuration.
 
@@ -2071,7 +2070,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>available</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.231">available</a>(int&nbsp;port)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.230">available</a>(int&nbsp;port)</pre>
 <div class="block">Checks to see if a specific port is available.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2087,7 +2086,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>memStoreTSTagsAndOffheapCombination</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.286">memStoreTSTagsAndOffheapCombination</a>()</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.285">memStoreTSTagsAndOffheapCombination</a>()</pre>
 </li>
 </ul>
 <a name="createLocalHTU--">
@@ -2097,7 +2096,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <li class="blockList">
 <h4>createLocalHTU</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.364">createLocalHTU</a>()</pre>
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.363">createLocalHTU</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#HBaseTestingUtility--"><code>HBaseTestingUtility()</code></a> instead</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2112,7 +2111,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <li class="blockList">
 <h4>createLocalHTU</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.373">createLocalHTU</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.372">createLocalHTU</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#HBaseTestingUtility-org.apache.hadoop.conf.Configuration-"><code>HBaseTestingUtility(Configuration)</code></a> instead</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2126,7 +2125,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionAndWAL</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.380">closeRegionAndWAL</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/regionserver/Region.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;r)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.379">closeRegionAndWAL</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/regionserver/Region.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.regionserver">Region</a>&nbsp;r)
                               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">Close both the region <code>r</code> and it's underlying WAL. For use in tests.</div>
 <dl>
@@ -2141,7 +2140,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionAndWAL</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.387">closeRegionAndWAL</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/regionserver/HRegion.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.386">closeRegionAndWAL</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/regionserver/HRegion.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;r)
                               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">Close both the HRegion <code>r</code> and it's underlying WAL. For use in tests.</div>
 <dl>
@@ -2156,7 +2155,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.406">getConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.405">getConfiguration</a>()</pre>
 <div class="block">Returns this classes's instance of <code>Configuration</code>.  Be careful how
  you use the returned Configuration since <a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Connection.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client"><code>Connection</code></a> instances
  can be shared.  The Map of Connections is keyed by the Configuration.  If
@@ -2179,7 +2178,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>setHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.410">setHBaseCluster</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/HBaseCluster.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;hbaseCluster)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.409">setHBaseCluster</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/HBaseCluster.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;hbaseCluster)</pre>
 </li>
 </ul>
 <a name="setupDataTestDir--">
@@ -2188,7 +2187,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>setupDataTestDir</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.431">setupDataTestDir</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.430">setupDataTestDir</a>()</pre>
 <div class="block">Home our data in a dir under <a href="../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html#DEFAULT_BASE_TEST_DIRECTORY"><code>HBaseCommonTestingUtility.DEFAULT_BASE_TEST_DIRECTORY</code></a>.
  Give it a random name so can have many concurrent tests running if
  we need to.  It needs to amend the <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#TEST_DIRECTORY_KEY"><code>TEST_DIRECTORY_KEY</code></a>
@@ -2216,7 +2215,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <li class="blockList">
 <h4>getMetaTableDescriptor</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescriptor.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.498">getMetaTableDescriptor</a>()</pre>
+public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescriptor.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">HTableDescriptor</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.497">getMetaTableDescriptor</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0 version and will be removed in 3.0 version.
              use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getMetaTableDescriptorBuilder--"><code>getMetaTableDescriptorBuilder()</code></a></span></div>
 <dl>
@@ -2231,7 +2230,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaTableDescriptorBuilder</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.505">getMetaTableDescriptorBuilder</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/TableDescriptorBuilder.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">TableDescriptorBuilder</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.504">getMetaTableDescriptorBuilder</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>META table descriptor</dd>
@@ -2244,7 +2243,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataTestDirOnTestFS</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.519">getDataTestDirOnTestFS</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.518">getDataTestDirOnTestFS</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 a Path in the test filesystem, obtained from <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getTestFileSystem--"><code>getTestFileSystem()</code></a>
  to write temporary test data. Call this method after setting up the mini dfs cluster
@@ -2263,7 +2262,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataTestDirOnTestFS</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.534">getDataTestDirOnTestFS</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;subdirName)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.533">getDataTestDirOnTestFS</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;subdirName)
                                                  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 a Path in the test filesystem, obtained from <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getTestFileSystem--"><code>getTestFileSystem()</code></a>
  to write temporary test data. Call this method after setting up the mini dfs cluster
@@ -2284,7 +2283,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupDataTestDirOnTestFS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.579">cleanupDataTestDirOnTestFS</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.578">cleanupDataTestDirOnTestFS</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">Cleans the test data directory on the test filesystem.</div>
 <dl>
@@ -2301,7 +2300,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupDataTestDirOnTestFS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.591">cleanupDataTestDirOnTestFS</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;subdirName)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.590">cleanupDataTestDirOnTestFS</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;subdirName)
                                    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">Cleans a subdirectory under the test data directory on the test filesystem.</div>
 <dl>
@@ -2318,7 +2317,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.603">startMiniDFSCluster</a>(int&nbsp;servers)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.602">startMiniDFSCluster</a>(int&nbsp;servers)
                                                           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>
 <div class="block">Start a minidfscluster.</div>
 <dl>
@@ -2339,7 +2338,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.618">startMiniDFSCluster</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;hosts)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.617">startMiniDFSCluster</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;hosts)
                                                           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>
 <div class="block">Start a minidfscluster.
  This is useful if you want to run datanode on distinct hosts for things
@@ -2364,7 +2363,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.636">startMiniDFSCluster</a>(int&nbsp;servers,
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.635">startMiniDFSCluster</a>(int&nbsp;servers,
                                                                  <a href="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;hosts)
                                                           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>
 <div class="block">Start a minidfscluster.
@@ -2388,7 +2387,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.653">startMiniDFSCluster</a>(int&nbsp;servers,
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.652">startMiniDFSCluster</a>(int&nbsp;servers,
                                                                  <a href="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;racks,
                                                                  <a href="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;hosts)
                                                           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>
@@ -2404,7 +2403,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSClusterForTestWAL</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.684">startMiniDFSClusterForTestWAL</a>(int&nbsp;namenodePort)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.683">startMiniDFSClusterForTestWAL</a>(int&nbsp;namenodePort)
                                                                     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>
@@ -2418,7 +2417,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>isReadShortCircuitOn</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.720">isReadShortCircuitOn</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.719">isReadShortCircuitOn</a>()</pre>
 <div class="block">Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property.
   This allows to specify this parameter on the command line.
    If not set, default is true.</div>
@@ -2430,7 +2429,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniDFSCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.762">shutdownMiniDFSCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.761">shutdownMiniDFSCluster</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">Shuts down instance created by call to <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniDFSCluster-int-"><code>startMiniDFSCluster(int)</code></a>
  or does nothing.</div>
@@ -2447,7 +2446,7 @@ public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/HTableDescri
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.781">startMiniCluster</a>(boolean&nbsp;createWALDir)
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.780">startMiniCluster</a>(boolean&nbsp;createWALDir)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
 <div class="block">Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.
@@ -2471,7 +2470,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.797">startMiniCluster</a>(int&nbsp;numSlaves,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.796">startMiniCluster</a>(int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
@@ -2497,7 +2496,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.815">startMiniCluster</a>(int&nbsp;numSlaves,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.814">startMiniCluster</a>(int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir,
                                                      boolean&nbsp;createWALDir)
                                               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>
@@ -2525,7 +2524,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.834">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.833">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir)
                                               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>
@@ -2553,7 +2552,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.852">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.851">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
@@ -2579,7 +2578,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.871">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.870">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts,
                                                      boolean&nbsp;createRootDir)
@@ -2610,7 +2609,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.891">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.890">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts)
                                               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>
@@ -2639,7 +2638,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.910">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.909">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes)
                                               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>
@@ -2667,7 +2666,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.932">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.931">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts,
                                                      <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="../../../../../apidocs/org/apache/hadoop/hbase/master/HMaster.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.master">HMaster</a>&gt;&nbsp;masterClass,
@@ -2700,7 +2699,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.959">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.958">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes,
                                                      <a href="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;dataNodeHosts,
@@ -2735,7 +2734,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.988">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.987">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes,
                                                      <a href="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;dataNodeHosts,
@@ -2773,7 +2772,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1008">startMiniCluster</a>(int&nbsp;numSlaves)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1007">startMiniCluster</a>(int&nbsp;numSlaves)
                                   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>
 <div class="block">Start up a minicluster of hbase, dfs and zookeeper clusters with given slave node number.
  All other options will use default values, defined in <a href="../../../../../apidocs/org/apache/hadoop/hbase/StartMiniClusterOption.Builder.html?is-external=true" title="class or interface in org.apache.hadoop.hbase"><code>StartMiniClusterOption.Builder</code></a>.</div>
@@ -2794,7 +2793,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1020">startMiniCluster</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1019">startMiniCluster</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>
 <div class="block">Start up a minicluster of hbase, dfs and zookeeper all using default options.
  Option default value can be found in <a href="../../../../../apidocs/org/apache/hadoop/hbase/StartMiniClusterOption.Builder.html?is-external=true" title="class or interface in org.apache.hadoop.hbase"><code>StartMiniClusterOption.Builder</code></a>.</div>
@@ -2813,7 +2812,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1030">startMiniCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1029">startMiniCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
                                   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>
 <div class="block">Start up a mini cluster of hbase, optionally dfs and zookeeper if needed.
  It modifies Configuration.  It homes the cluster data directory under a random
@@ -2832,7 +2831,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1068">startMiniHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1067">startMiniHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
                                        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">Starts up mini hbase cluster.
@@ -2856,7 +2855,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1114">startMiniHBaseCluster</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1113">startMiniHBaseCluster</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>
 <div class="block">Starts up mini hbase cluster using default options.
@@ -2878,7 +2877,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1129">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1128">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers)
                                                    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>
@@ -2907,7 +2906,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1148">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1147">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers,
                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;rsPorts)
                                                    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>,
@@ -2938,7 +2937,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1171">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1170">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers,
                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;rsPorts,
                                                           <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="../../../../../apidocs/org/apache/hadoop/hbase/master/HMaster.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.master">HMaster</a>&gt;&nbsp;masterClass,
@@ -2976,7 +2975,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>restartHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1187">restartHBaseCluster</a>(int&nbsp;servers)
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1186">restartHBaseCluster</a>(int&nbsp;servers)
                          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">Starts the hbase cluster up again after shutting it down previously in a
@@ -2996,7 +2995,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1215">getMiniHBaseCluster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1214">getMiniHBaseCluster</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Current mini hbase cluster. Only has something in it after a call
@@ -3012,7 +3011,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1228">shutdownMiniCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1227">shutdownMiniCluster</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>
 <div class="block">Stops mini hbase, zk, and hdfs clusters.</div>
 <dl>
@@ -3030,7 +3029,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1242">shutdownMiniHBaseCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1241">shutdownMiniHBaseCluster</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 HBase mini cluster.  Does not shutdown zk or dfs if running.</div>
 <dl>
@@ -3045,7 +3044,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultRootDirPath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1274">getDefaultRootDirPath</a>(boolean&nbsp;create)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1273">getDefaultRootDirPath</a>(boolean&nbsp;create)
                                                 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 path to the default root dir the minicluster uses. If <code>create</code>
  is true, a new root directory path is fetched irrespective of whether it has been fetched
@@ -3065,7 +3064,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultRootDirPath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1289">getDefaultRootDirPath</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1288">getDefaultRootDirPath</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">Same as {<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getDefaultRootDirPath-boolean-"><code>getDefaultRootDirPath(boolean create)</code></a>
  except that <code>create</code> flag is false.
@@ -3084,7 +3083,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1305">createRootDir</a>(boolean&nbsp;create)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1304">createRootDir</a>(boolean&nbsp;create)
                                         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">Creates an hbase rootdir in user home directory.  Also creates hbase
  version file.  Normally you won't make use of this method.  Root hbasedir
@@ -3109,7 +3108,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1320">createRootDir</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1319">createRootDir</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">Same as <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#createRootDir-boolean-"><code>createRootDir(boolean create)</code></a>
  except that <code>create</code> flag is false.</div>
@@ -3127,7 +3126,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1333">createWALRootDir</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1332">createWALRootDir</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">Creates a hbase walDir in the user's home directory.
  Normally you won't make use of this method. Root hbaseWALDir
@@ -3147,7 +3146,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1355">flush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1354">flush</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">Flushes all caches in the mini hbase cluster</div>
 <dl>
@@ -3162,7 +3161,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1363">flush</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1362">flush</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Flushes all caches in the mini hbase cluster</div>
 <dl>
@@ -3177,7 +3176,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>compact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1371">compact</a>(boolean&nbsp;major)
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1370">compact</a>(boolean&nbsp;major)
              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">Compact all regions in the mini hbase cluster</div>
 <dl>
@@ -3192,7 +3191,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>compact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1379">compact</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1378">compact</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                     boolean&nbsp;major)
              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">Compact all of a table's reagion in the mini hbase cluster</div>
@@ -3208,7 +3207,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1390">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1389">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="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;family)
                   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 table.</div>
@@ -3229,7 +3228,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1402">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1401">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          <a href="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;families)
                   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 table.</div>
@@ -3250,7 +3249,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1418">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1417">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[]&nbsp;family)
                   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 table.</div>
@@ -3271,7 +3270,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createMultiRegionTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1431">createMultiRegionTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1430">createMultiRegionTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                     byte[]&nbsp;family,
                                     int&nbsp;numRegions)
                              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>
@@ -3294,7 +3293,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1448">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1447">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[][]&nbsp;families)
                   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 table.</div>
@@ -3315,7 +3314,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createMultiRegionTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1460">createMultiRegionTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1459">createMultiRegionTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                                     byte[][]&nbsp;families)
                              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 table with multiple regions.</div>
@@ -3336,7 +3335,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1472">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1471">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[][]&nbsp;families,
                          byte[][]&nbsp;splitKeys)
                   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>
@@ -3359,7 +3358,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1486">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1485">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[][]&nbsp;families,
                          byte[][]&nbsp;splitKeys,
                          int&nbsp;replicaCount)
@@ -3384,7 +3383,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1492">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1491">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/TableName.html?is-external=true" title="class or interface in org.apache.hadoop.hbase">TableName</a>&nbsp;tableName,
                          byte[][]&nbsp;families,
                          int&nbsp;numVersions,
                          byte[]&nbsp;startKey,
@@ -3403,7 +3402,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1512">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/TableDescriptor.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd,
+<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1511">createTable</a>(<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/TableDescriptor.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd,
                          byte[][]&nbsp;families,
                          org.apache.hadoop.conf.Configuration&nbsp;c)
                   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>
@@ -3426,7 +3425,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>public&nbsp;<a href="../../../../../apidocs/org/apache/hadoop/hbase/client/Table.html?is-external=true" title="class or interface in org.apache.hadoop.hbase.client">Table</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestin

<TRUNCATED>

[25/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/HStoreFile.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/HStoreFile.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/HStoreFile.html
index 6513db7..845e729 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/HStoreFile.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/HStoreFile.html
@@ -1102,12 +1102,22 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>private long</code></td>
-<td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.function.Predicate-">getStorefilesSize</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
+<td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.Collection-java.util.function.Predicate-">getStorefilesSize</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>private long</code></td>
+<td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.Collection-java.util.function.Predicate-">getStorefilesSize</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files,
+                 <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html?is-external=true" title="class or interface in java.util.function">Predicate</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;predicate)</code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private long</code></td>
 <td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalSize-java.util.Collection-">getTotalSize</a></span>(<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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;sfs)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>private long</code></td>
+<td class="colLast"><span class="typeNameLabel">HStore.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStore.html#getTotalUmcompressedBytes-java.util.List-">getTotalUmcompressedBytes</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;&nbsp;files)</code>&nbsp;</td>
+</tr>
 <tr 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/regionserver/HStoreFile.html" title="class in org.apache.hadoop.hbase.regionserver">HStoreFile</a>&gt;</code></td>
 <td class="colLast"><span class="typeNameLabel">DefaultStoreFileManager.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/DefaultStoreFileManager.html#getUnneededFiles-long-java.util.List-">getUnneededFiles</a></span>(long&nbsp;maxTs,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 e493b58..44806c1 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/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/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/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/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/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/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/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/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/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/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 6851ee1..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/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.MatchCode.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">ScanQueryMatcher.MatchCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.querymatcher.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.DropDeletesInOutput.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">StripeCompactionScanQueryMatcher.DropDeletesInOutput</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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..e8df157 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -248,8 +248,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.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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 cd3870f..30c4e73 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/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 034077c..c20ff47 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index f594c43..8051208 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -142,9 +142,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 dfa02b5..13f949c 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -191,9 +191,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.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>
+<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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
----------------------------------------------------------------------
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 4ade4c1..2853d09 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -200,8 +200,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.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftServerRunner.ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftServerRunner.ImplType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 10b0fde..a90e38b 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -540,14 +540,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/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HBaseFsck.ErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HBaseFsck.ErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/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/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/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 </ul>
 </li>
 </ul>

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

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 633d43a..051e8e4 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 = "Sun Oct 21 14:43:28 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Mon Oct 22 14:44:49 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 = "f5f881f57d789d4aabea2eec95e064ba";<a name="line.15"></a>
+<span class="sourceLineNo">015</span>  public static final String srcChecksum = "71b52165b80cc27916da6d7d4fb1ab20";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
 
 


[07/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/client/TestAdmin2.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAdmin2.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAdmin2.html
index f024184..8143ce8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAdmin2.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAdmin2.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":9,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":9,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.80">TestAdmin2</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.83">TestAdmin2</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 to test HBaseAdmin.
  Spins up the minicluster once at test start and then takes it down afterward.
@@ -278,70 +278,76 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <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/client/TestAdmin2.html#testGetRegionInfo--">testGetRegionInfo</a></span>()</code>
+<div class="block">TestCase for HBASE-21355</div>
+</td>
+</tr>
+<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/client/TestAdmin2.html#testGetTableRegions--">testGetTableRegions</a></span>()</code>
 <div class="block">For HBASE-2556</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/client/TestAdmin2.html#testIsEnabledOrDisabledOnUnknownTable--">testIsEnabledOrDisabledOnUnknownTable</a></span>()</code>&nbsp;</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/client/TestAdmin2.html#testMoveToPreviouslyAssignedRS--">testMoveToPreviouslyAssignedRS</a></span>()</code>&nbsp;</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/client/TestAdmin2.html#testReadOnlyTable--">testReadOnlyTable</a></span>()</code>
 <div class="block">Test read only tables</div>
 </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/client/TestAdmin2.html#testRegionNormalizer--">testRegionNormalizer</a></span>()</code>&nbsp;</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/client/TestAdmin2.html#testShouldUnassignTheRegion--">testShouldUnassignTheRegion</a></span>()</code>&nbsp;</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/client/TestAdmin2.html#testTableExistsExceptionWithATable--">testTableExistsExceptionWithATable</a></span>()</code>
 <div class="block">For HADOOP-2579</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/client/TestAdmin2.html#testTableNameClash--">testTableNameClash</a></span>()</code>
 <div class="block">Test for hadoop-1581 'HBASE: Unopenable tablename bug'.</div>
 </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/client/TestAdmin2.html#testTableNames--">testTableNames</a></span>()</code>
 <div class="block">Test that user table names can contain '-' and '.' so long as they do not
  start with same.</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/client/TestAdmin2.html#testTableNotDisabledExceptionWithATable--">testTableNotDisabledExceptionWithATable</a></span>()</code>
 <div class="block">Can't enable a table if the table isn't in disabled state</div>
 </td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdmin2.html#testTableNotEnabledExceptionWithATable--">testTableNotEnabledExceptionWithATable</a></span>()</code>
 <div class="block">Can't disable a table if the table isn't in enabled state</div>
 </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/client/TestAdmin2.html#testTableNotFoundExceptionWithoutAnyTables--">testTableNotFoundExceptionWithoutAnyTables</a></span>()</code>
 <div class="block">For HADOOP-2579</div>
 </td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/client/TestAdmin2.html#testWALRollWriting--">testWALRollWriting</a></span>()</code>&nbsp;</td>
 </tr>
@@ -373,7 +379,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.83">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.86">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -382,7 +388,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/client/TestAdmin2.html#line.86">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.89">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -391,7 +397,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.87">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.90">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="admin">
@@ -400,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>admin</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.88">admin</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.Admin <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.91">admin</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -409,7 +415,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.91">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.94">name</a></pre>
 </li>
 </ul>
 </li>
@@ -426,7 +432,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestAdmin2</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.80">TestAdmin2</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.83">TestAdmin2</a>()</pre>
 </li>
 </ul>
 </li>
@@ -443,7 +449,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.94">setUpBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.97">setUpBeforeClass</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>
@@ -457,7 +463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.105">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.108">tearDownAfterClass</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>
@@ -471,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>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.110">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.113">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -485,7 +491,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.115">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.118">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -499,7 +505,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testCreateBadTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.122">testCreateBadTables</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.125">testCreateBadTables</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>
@@ -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>testTableNameClash</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.179">testTableNameClash</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.182">testTableNameClash</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>
 <div class="block">Test for hadoop-1581 'HBASE: Unopenable tablename bug'.</div>
 <dl>
@@ -528,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>testCreateTableRPCTimeOut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.199">testCreateTableRPCTimeOut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.202">testCreateTableRPCTimeOut</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>
 <div class="block">HMaster.createTable used to be kind of synchronous call
  Thus creating of table with lots of regions can cause RPC timeout
@@ -546,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>testReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.223">testReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.226">testReadOnlyTable</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>
 <div class="block">Test read only tables</div>
 <dl>
@@ -561,7 +567,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableNames</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.240">testTableNames</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.243">testTableNames</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">Test that user table names can contain '-' and '.' so long as they do not
  start with same. HBASE-771</div>
@@ -577,7 +583,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableExistsExceptionWithATable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.269">testTableExistsExceptionWithATable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.272">testTableExistsExceptionWithATable</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">For HADOOP-2579</div>
 <dl>
@@ -592,7 +598,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableNotEnabledExceptionWithATable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.280">testTableNotEnabledExceptionWithATable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.283">testTableNotEnabledExceptionWithATable</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">Can't disable a table if the table isn't in enabled state</div>
 <dl>
@@ -607,7 +613,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableNotDisabledExceptionWithATable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.292">testTableNotDisabledExceptionWithATable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.295">testTableNotDisabledExceptionWithATable</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">Can't enable a table if the table isn't in disabled state</div>
 <dl>
@@ -622,7 +628,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTableNotFoundExceptionWithoutAnyTables</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.307">testTableNotFoundExceptionWithoutAnyTables</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.310">testTableNotFoundExceptionWithoutAnyTables</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">For HADOOP-2579</div>
 <dl>
@@ -637,7 +643,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testShouldUnassignTheRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.315">testShouldUnassignTheRegion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.318">testShouldUnassignTheRegion</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>
@@ -651,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>testCloseRegionIfInvalidRegionNameIsPassed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.342">testCloseRegionIfInvalidRegionNameIsPassed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.345">testCloseRegionIfInvalidRegionNameIsPassed</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>
@@ -665,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>testCloseRegionThatFetchesTheHRIFromMeta</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.368">testCloseRegionThatFetchesTheHRIFromMeta</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.371">testCloseRegionThatFetchesTheHRIFromMeta</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>
@@ -679,7 +685,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createTable</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.HBaseAdmin&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.397">createTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
+<pre>private&nbsp;org.apache.hadoop.hbase.client.HBaseAdmin&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.400">createTable</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName)
                                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -693,7 +699,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createTableWithDefaultConf</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.408">createTableWithDefaultConf</a>(byte[]&nbsp;TABLENAME)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.411">createTableWithDefaultConf</a>(byte[]&nbsp;TABLENAME)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -707,7 +713,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createTableWithDefaultConf</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.412">createTableWithDefaultConf</a>(org.apache.hadoop.hbase.TableName&nbsp;TABLENAME)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.415">createTableWithDefaultConf</a>(org.apache.hadoop.hbase.TableName&nbsp;TABLENAME)
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -721,7 +727,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetTableRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.425">testGetTableRegions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.428">testGetTableRegions</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">For HBASE-2556</div>
 <dl>
@@ -736,7 +742,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testMoveToPreviouslyAssignedRS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.447">testMoveToPreviouslyAssignedRS</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.450">testMoveToPreviouslyAssignedRS</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>
@@ -752,7 +758,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testWALRollWriting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.462">testWALRollWriting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.465">testWALRollWriting</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>
@@ -766,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>setUpforLogRolling</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.485">setUpforLogRolling</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.488">setUpforLogRolling</a>()</pre>
 </li>
 </ul>
 <a name="startAndWriteData-org.apache.hadoop.hbase.TableName-byte:A-">
@@ -775,7 +781,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startAndWriteData</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.527">startAndWriteData</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegionServer&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.530">startAndWriteData</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                              byte[]&nbsp;value)
                                                                       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>
@@ -792,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>testCheckHBaseAvailableWithoutCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.561">testCheckHBaseAvailableWithoutCluster</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.564">testCheckHBaseAvailableWithoutCluster</a>()</pre>
 <div class="block">Check that we have an exception if the cluster is not there.</div>
 </li>
 </ul>
@@ -802,7 +808,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDisableCatalogTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.582">testDisableCatalogTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.585">testDisableCatalogTable</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>
@@ -816,7 +822,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testIsEnabledOrDisabledOnUnknownTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.598">testIsEnabledOrDisabledOnUnknownTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.601">testIsEnabledOrDisabledOnUnknownTable</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>
@@ -830,7 +836,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetRegion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.613">testGetRegion</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.616">testGetRegion</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>
@@ -844,7 +850,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testBalancer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.634">testBalancer</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.637">testBalancer</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>
@@ -858,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>testRegionNormalizer</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.656">testRegionNormalizer</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.659">testRegionNormalizer</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>
@@ -872,7 +878,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testAbortProcedureFail</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.678">testAbortProcedureFail</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.681">testAbortProcedureFail</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 +892,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetProcedures</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.687">testGetProcedures</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.690">testGetProcedures</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>
@@ -900,7 +906,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetLocks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.693">testGetLocks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.696">testGetLocks</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>
@@ -911,10 +917,10 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="testDecommissionRegionServers--">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>testDecommissionRegionServers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.699">testDecommissionRegionServers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.702">testDecommissionRegionServers</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>
@@ -922,6 +928,21 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </dl>
 </li>
 </ul>
+<a name="testGetRegionInfo--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>testGetRegionInfo</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestAdmin2.html#line.765">testGetRegionInfo</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>
+<div class="block">TestCase for HBASE-21355</div>
+<dl>
+<dt><span class="throwsLabel">Throws:</span></dt>
+<dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></code></dd>
+</dl>
+</li>
+</ul>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 ec56445..4837d80 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/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
index 1abdd7a..73a909f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.567">MasterProcedureTestingUtility.InjectAbortOnLoadListener</a>
+<pre>public static class <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.572">MasterProcedureTestingUtility.InjectAbortOnLoadListener</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener</pre>
 </li>
@@ -222,7 +222,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockList">
 <li class="blockList">
 <h4>procExec</h4>
-<pre>private final&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/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.569">procExec</a></pre>
+<pre>private final&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/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.574">procExec</a></pre>
 </li>
 </ul>
 <a name="procsToAbort">
@@ -231,7 +231,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockListLast">
 <li class="blockList">
 <h4>procsToAbort</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html?is-external=true" title="class or interface in java.util">TreeSet</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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.570">procsToAbort</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html?is-external=true" title="class or interface in java.util">TreeSet</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; <a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.575">procsToAbort</a></pre>
 </li>
 </ul>
 </li>
@@ -248,7 +248,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockListLast">
 <li class="blockList">
 <h4>InjectAbortOnLoadListener</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.572">InjectAbortOnLoadListener</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec)</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.577">InjectAbortOnLoadListener</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec)</pre>
 </li>
 </ul>
 </li>
@@ -265,7 +265,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockList">
 <li class="blockList">
 <h4>addProcId</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.576">addProcId</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.581">addProcId</a>(long&nbsp;procId)</pre>
 </li>
 </ul>
 <a name="procedureLoaded-long-">
@@ -274,7 +274,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureLoaded</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.584">procedureLoaded</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.589">procedureLoaded</a>(long&nbsp;procId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>procedureLoaded</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener</code></dd>
@@ -287,7 +287,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockList">
 <li class="blockList">
 <h4>procedureAdded</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.592">procedureAdded</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.597">procedureAdded</a>(long&nbsp;procId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>procedureAdded</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener</code></dd>
@@ -300,7 +300,7 @@ implements org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecuto
 <ul class="blockListLast">
 <li class="blockList">
 <h4>procedureFinished</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.595">procedureFinished</a>(long&nbsp;procId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.InjectAbortOnLoadListener.html#line.600">procedureFinished</a>(long&nbsp;procId)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>procedureFinished</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.procedure2.ProcedureExecutor.ProcedureExecutorListener</code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
index 7837c5f..6ee76f9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html
@@ -790,7 +790,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testRollbackRetriableFailure</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.533">testRollbackRetriableFailure</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.538">testRollbackRetriableFailure</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec,
                                                 long&nbsp;procId,
                                                 int&nbsp;lastStep)
                                          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>
@@ -811,7 +811,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRestartWithAbort</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.551">testRestartWithAbort</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec,
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/master/procedure/MasterProcedureTestingUtility.html#line.556">testRestartWithAbort</a>(org.apache.hadoop.hbase.procedure2.ProcedureExecutor&lt;org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv&gt;&nbsp;procExec,
                                         long&nbsp;procId)
                                  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>
 <div class="block">Restart the ProcedureExecutor and inject an abort to the specified procedure.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 d20b6d5..4327ae2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -580,14 +580,14 @@
 <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/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/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/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/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.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>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 1ee4477..ddb53a1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -220,9 +220,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.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestStateMachineProcedure.TestSMProcedureState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestStateMachineProcedure.TestSMProcedureState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureRecovery.TestStateMachineProcedure.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestProcedureBypass.StuckStateMachineState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestProcedureBypass.StuckStateMachineState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/TestYieldProcedures.TestStateMachineProcedure.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">TestYieldProcedures.TestStateMachineProcedure.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 931c3d0..fb1680b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -674,8 +674,8 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 40f9c1a..929782e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,10 +253,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index b21ae88..68397c8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -141,9 +141,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.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 </ul>
 </li>
 </ul>


[03/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
index 8d98ec3..f2d5735 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
@@ -179,4148 +179,4147 @@
 <span class="sourceLineNo">171</span> * avoiding port contention if another local HBase instance is already running).<a name="line.171"></a>
 <span class="sourceLineNo">172</span> * &lt;p&gt;To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"<a name="line.172"></a>
 <span class="sourceLineNo">173</span> * setting it to true.<a name="line.173"></a>
-<span class="sourceLineNo">174</span> * Trigger pre commit.<a name="line.174"></a>
-<span class="sourceLineNo">175</span> */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>@InterfaceAudience.Public<a name="line.176"></a>
-<span class="sourceLineNo">177</span>@SuppressWarnings("deprecation")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * used in mini dfs.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @deprecated can be used only with mini dfs<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Deprecated<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * table.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<a name="line.194"></a>
+<span class="sourceLineNo">174</span> */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>@InterfaceAudience.Public<a name="line.175"></a>
+<span class="sourceLineNo">176</span>@SuppressWarnings("deprecation")<a name="line.176"></a>
+<span class="sourceLineNo">177</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * used in mini dfs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @deprecated can be used only with mini dfs<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Deprecated<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * table.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<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>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private MiniDFSCluster dfsCluster = null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  private MiniMRCluster mrCluster = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private volatile boolean miniClusterRunning;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private String hadoopLogDir;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    * HBaseTestingUtility*/<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private volatile Connection connection;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private static String FS_URI;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   *<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param port the port number to check for availability<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public static boolean available(int port) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ServerSocket ss = null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    DatagramSocket ds = null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    try {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ss = new ServerSocket(port);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      ss.setReuseAddress(true);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      ds = new DatagramSocket(port);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      ds.setReuseAddress(true);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return true;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    } catch (IOException e) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      // Do nothing<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } finally {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      if (ds != null) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ds.close();<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 (ss != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          ss.close();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          /* should not be thrown */<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><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * testing.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    for (Compression.Algorithm comprAlgo :<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        configurations.add(new Object[] { comprAlgo, bloomType });<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>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    configurations.add(new Object[] { false, true });<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, false });<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    configurations.add(new Object[] { true, true });<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, true });<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, false, false });<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, true });<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    configurations.add(new Object[] { false, true, false });<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, true });<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, false, false });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, true });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    configurations.add(new Object[] { true, true, false });<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return Collections.unmodifiableList(configurations);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      bloomAndCompressionCombinations();<a name="line.300"></a>
+<span class="sourceLineNo">196</span>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private MiniDFSCluster dfsCluster = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private MiniMRCluster mrCluster = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private volatile boolean miniClusterRunning;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  private String hadoopLogDir;<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    * HBaseTestingUtility*/<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile Connection connection;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private static String FS_URI;<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param port the port number to check for availability<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public static boolean available(int port) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    ServerSocket ss = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    DatagramSocket ds = null;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      ss = new ServerSocket(port);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      ss.setReuseAddress(true);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      ds = new DatagramSocket(port);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      ds.setReuseAddress(true);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return true;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // Do nothing<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    } finally {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (ds != null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        ds.close();<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>      if (ss != null) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          ss.close();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        } catch (IOException e) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          /* should not be thrown */<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return false;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * testing.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (Compression.Algorithm comprAlgo :<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        configurations.add(new Object[] { comprAlgo, bloomType });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    configurations.add(new Object[] { false, false });<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, true });<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    configurations.add(new Object[] { true, false });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, true });<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    configurations.add(new Object[] { false, false, true });<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, false });<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, true, true });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    configurations.add(new Object[] { true, false, true });<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, false });<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, true, true });<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, false });<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    return Collections.unmodifiableList(configurations);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      bloomAndCompressionCombinations();<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><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   *<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * at which point they will switch to using mini DFS for storage.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public HBaseTestingUtility() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * at which point they will switch to using mini DFS for storage.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param conf The configuration to use for further operations<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    super(conf);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Save this for when setting default file:// breaks things<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // Every cluster is a local cluster until we start DFS<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    // Note that conf could be null, but this.conf will not be<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    String dataTestDir = getDataTestDir().toString();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    // tests opt-out for random port assignment<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return a normal HBaseTestingUtility<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   */<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  @Deprecated<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @return a normal HBaseTestingUtility<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   */<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Deprecated<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return new HBaseTestingUtility(c);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    closeRegionAndWAL((HRegion)r);<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>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (r == null) return;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    r.close();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (r.getWAL() == null) return;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    r.getWAL().close();<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>  /**<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * make a copy and use that.  Do<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return Instance of Configuration.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public Configuration getConfiguration() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return super.getConfiguration();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Give it a random name so can have many concurrent tests running if<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * System property, as it's what minidfscluster bases<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * instances -- another instance could grab the temporary<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * single instance only is how the minidfscluster works.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * We also create the underlying directory for<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.425"></a>
-<span class="sourceLineNo">426</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.426"></a>
-<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * @return The calculated data test build directory, if newly-created.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  protected Path setupDataTestDir() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    Path testPath = super.setupDataTestDir();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (null == testPath) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      "hadoop.log.dir",<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      testPath, "hadoop-log-dir");<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    createSubDirAndSystemProperty(<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      "hadoop.tmp.dir",<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      testPath, "hadoop-tmp-dir");<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    createSubDir(<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      "mapreduce.cluster.local.dir",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      testPath, "mapred-local-dir");<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    String propertyName, Path parent, String subDirName){<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    String sysValue = System.getProperty(propertyName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (sysValue != null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // There is already a value set. So we do nothing but hope<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      //  that there will be no conflicts<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      String confValue = conf.get(propertyName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.466"></a>
-<span class="sourceLineNo">467</span>       LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>         propertyName + " property value differs in configuration and system: "+<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      createSubDir(propertyName, parent, subDirName);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      System.setProperty(propertyName, conf.get(propertyName));<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><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * for the test filesystem by default<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #setupDataTestDirOnTestFS()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see #getTestFileSystem()<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    FileSystem fs = getTestFileSystem();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return META table descriptor<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Deprecated<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @return META table descriptor<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * if the test relies on it.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return a unique path in the test filesystem<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    if (dataTestDirOnTestFS == null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * if the test relies on it.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a unique path in the test filesystem<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /**<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Sets up a path in test filesystem to be used by tests.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Creates a new directory if not already setup.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   */<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private void setupDataTestDirOnTestFS() throws IOException {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    if (dataTestDirOnTestFS != null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      LOG.warn("Data test on test fs dir already setup in "<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          + dataTestDirOnTestFS.toString());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<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>   * Sets up a new path in test filesystem to be used by tests.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   */<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private Path getNewDataTestDirOnTestFS() throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    //The file system can be either local, mini dfs, or if the configuration<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    //is supplied externally, it can be an external cluster FS. If it is a local<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    //file system, the tests should use getBaseTestDir, otherwise, we can use<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    //the working directory, and create a unique sub dir there<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem fs = getTestFileSystem();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path newDataTestDir;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    String randomStr = getRandomUUID().toString();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      newDataTestDir = new Path(getDataTestDir(), randomStr);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      File dataTestDir = new File(newDataTestDir.toString());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (deleteOnExit()) dataTestDir.deleteOnExit();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      Path base = getBaseTestDirOnTestFS();<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      newDataTestDir = new Path(base, randomStr);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return newDataTestDir;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<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>   * Cleans the test data directory on the test filesystem.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return True if we removed the test dirs<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean cleanupDataTestDirOnTestFS() throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    if (ret)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      dataTestDirOnTestFS = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    return ret;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Cleans a subdirectory under the test data directory on the test filesystem.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * @return True if we removed child<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * @throws IOException<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
-<span class="sourceLineNo">591</span>  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    Path cpath = getDataTestDirOnTestFS(subdirName);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    return getTestFileSystem().delete(cpath, true);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  /**<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * Start a minidfscluster.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @param servers How many DNs to start.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws Exception<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * @see #shutdownMiniDFSCluster()<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return The mini dfs cluster created.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return startMiniDFSCluster(servers, null);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Start a minidfscluster.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * This is useful if you want to run datanode on distinct hosts for things<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * like HDFS block location verification.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * If you start MiniDFSCluster without host names, all instances of the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * datanodes will have the same host name.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * @param hosts hostnames DNs to run on.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @throws Exception<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @see #shutdownMiniDFSCluster()<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @return The mini dfs cluster created.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  public MiniDFSCluster startMiniDFSCluster(final String hosts[])<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  throws Exception {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if ( hosts != null &amp;&amp; hosts.length != 0) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return startMiniDFSCluster(hosts.length, hosts);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      return startMiniDFSCluster(1, null);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Start a minidfscluster.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Can only create one.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param servers How many DNs to start.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param hosts hostnames DNs to run on.<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @throws Exception<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @see #shutdownMiniDFSCluster()<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @return The mini dfs cluster created.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[])<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  throws Exception {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return startMiniDFSCluster(servers, null, hosts);<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>  private void setFs() throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if(this.dfsCluster == null){<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      LOG.info("Skipping setting fs because dfsCluster is null");<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    FileSystem fs = this.dfsCluster.getFileSystem();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    FSUtils.setFsDefault(this.conf, new Path(fs.getUri()));<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    // re-enable this check with dfs<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);<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>  public MiniDFSCluster startMiniDFSCluster(int servers, final  String racks[], String hosts[])<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      throws Exception {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    createDirsAndSetProperties();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Error level to skip some warnings specific to the minicluster. See HBASE-4709<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.util.MBeans.class).<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.impl.MetricsSystemImpl.class).<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    TraceUtil.initTracer(conf);<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    this.dfsCluster = new MiniDFSCluster(0, this.conf, servers, true, true,<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        true, null, racks, hosts, null);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // Set this just-started cluster as our filesystem.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    setFs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Wait for the cluster to be totally up<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    this.dfsCluster.waitClusterUp();<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    //reset the test directory for test file system<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    dataTestDirOnTestFS = null;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String dataTestDir = getDataTestDir().toString();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(HConstants.HBASE_DIR, dataTestDir);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return this.dfsCluster;<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>  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    createDirsAndSetProperties();<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    dfsCluster = new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        null, null, null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return dfsCluster;<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>  /** This is used before starting HDFS and map-reduce mini-clusters */<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  private void createDirsAndSetProperties() throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    setupClusterTestDir();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    conf.set(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.setProperty(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    createDirAndSetProperty("cache_data", "test.cache.data");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    createDirAndSetProperty("hadoop_tmp", "hadoop.tmp.dir");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    hadoopLogDir = createDirAndSetProperty("hadoop_logs", "hadoop.log.dir");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    createDirAndSetProperty("mapred_local", "mapreduce.cluster.local.dir");<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    createDirAndSetProperty("mapred_temp", "mapreduce.cluster.temp.dir");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    enableShortCircuit();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Path root = getDataTestDirOnTestFS("hadoop");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    conf.set(MapreduceTestingShim.getMROutputDirProp(),<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      new Path(root, "mapred-output-dir").toString());<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set("mapreduce.jobtracker.staging.root.dir",<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    conf.set("yarn.app.mapreduce.am.staging-dir",<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      new Path(root, "mapreduce-am-staging-root-dir").toString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * at which point they will switch to using mini DFS for storage.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   */<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public HBaseTestingUtility() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   *<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   *<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * at which point they will switch to using mini DFS for storage.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param conf The configuration to use for further operations<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    super(conf);<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Save this for when setting default file:// breaks things<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Every cluster is a local cluster until we start DFS<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Note that conf could be null, but this.conf will not be<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String dataTestDir = getDataTestDir().toString();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // tests opt-out for random port assignment<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, 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>  /**<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @return a normal HBaseTestingUtility<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Deprecated<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return a normal HBaseTestingUtility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Deprecated<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new HBaseTestingUtility(c);<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>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    closeRegionAndWAL((HRegion)r);<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>  /**<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (r == null) return;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    r.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (r.getWAL() == null) return;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    r.getWAL().close();<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>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * make a copy and use that.  Do<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * @return Instance of Configuration.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public Configuration getConfiguration() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return super.getConfiguration();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Give it a random name so can have many concurrent tests running if<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * System property, as it's what minidfscluster bases<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * instances -- another instance could grab the temporary<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * single instance only is how the minidfscluster works.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * We also create the underlying directory for<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   *<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return The calculated data test build directory, if newly-created.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  protected Path setupDataTestDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Path testPath = super.setupDataTestDir();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (null == testPath) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      "hadoop.log.dir",<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      testPath, "hadoop-log-dir");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    createSubDirAndSystemProperty(<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      "hadoop.tmp.dir",<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      testPath, "hadoop-tmp-dir");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    createSubDir(<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      "mapreduce.cluster.local.dir",<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      testPath, "mapred-local-dir");<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    String propertyName, Path parent, String subDirName){<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String sysValue = System.getProperty(propertyName);<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (sysValue != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // There is already a value set. So we do nothing but hope<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      //  that there will be no conflicts<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String confValue = conf.get(propertyName);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.465"></a>
+<span class="sourceLineNo">466</span>       LOG.warn(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>         propertyName + " property value differs in configuration and system: "+<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      createSubDir(propertyName, parent, subDirName);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      System.setProperty(propertyName, conf.get(propertyName));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<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>  /**<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * for the test filesystem by default<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #setupDataTestDirOnTestFS()<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see #getTestFileSystem()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    FileSystem fs = getTestFileSystem();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>   * @return META table descriptor<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  @Deprecated<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>   * @return META table descriptor<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    } catch (IOException e) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  /**<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * if the test relies on it.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a unique path in the test filesystem<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   */<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    if (dataTestDirOnTestFS == null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * if the test relies on it.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @return a unique path in the test filesystem<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>  /**<a name="line.537"><

<TRUNCATED>

[19/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>            v -&gt; {<a name="line.1091"></a

<TRUNCATED>

[12/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 8f94fc0..9a5f0c3 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -461,7 +461,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 35a17c9..6f4f413 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -341,7 +341,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index f5da520..751cfe4 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -421,7 +421,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index c937887..f3d0b15 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -301,7 +301,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index 52a3649..2fa05fb 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -298,7 +298,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 24a5645..de43453 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -501,7 +501,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index d5891c6..6a56c16 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -351,7 +351,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index ead9879..c0fea89 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -469,7 +469,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 3442a78..1a08d78 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -450,7 +450,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index 474eb99..8ad006a 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index 0e81820..ec0e26f 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -385,7 +385,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index be81279..5b11fc3 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -779,7 +779,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index 9ce248c..f1567c8 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -345,7 +345,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index 9480254..4a5394b 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -315,7 +315,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index c23819e..995e65b 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index cef9d98..3ca2b35 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -318,7 +318,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index 79ce0ba..dcc4f91 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -313,7 +313,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index af89f20..8870781 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -341,7 +341,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index c3707d7..f91245b 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -309,7 +309,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index 886d110..8292d2e 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -343,7 +343,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 3941029..b84044d 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -530,7 +530,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index 38d5abf..47a6811 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -770,7 +770,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 


[18/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>            v 

<TRUNCATED>

[29/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 0561578..8fb5a05 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -51489,7 +51489,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize--">getStorefilesSize()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.function.Predicate-">getStorefilesSize(Predicate&lt;HStoreFile&gt;)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#getStorefilesSize-java.util.Collection-java.util.function.Predicate-">getStorefilesSize(Collection&lt;HStoreFile&gt;, Predicate&lt;HStoreFile&gt;)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/Store.html#getStorefilesSize--">getStorefilesSize()</a></span> - Method in interface org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/Store.html" title="interface in org.apache.hadoop.hbase.regionserver">Store</a></dt>
 <dd>&nbsp;</dd>
@@ -53441,6 +53441,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/backup/BackupRequest.html#getTotalTasks--">getTotalTasks()</a></span> - Method in class org.apache.hadoop.hbase.backup.<a href="org/apache/hadoop/hbase/backup/BackupRequest.html" title="class in org.apache.hadoop.hbase.backup">BackupRequest</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/HStore.html#getTotalUmcompressedBytes-java.util.List-">getTotalUmcompressedBytes(List&lt;HStoreFile&gt;)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html#getTotalUncompressedBytes--">getTotalUncompressedBytes()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.html" title="class in org.apache.hadoop.hbase.io.hfile">FixedFileTrailer</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html#getTotalUncompressedBytes--">getTotalUncompressedBytes()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/StoreFileReader.html" title="class in org.apache.hadoop.hbase.regionserver">StoreFileReader</a></dt>
@@ -64308,8 +64310,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#isNextFinished--">isNextFinished()</a></span> - Method in interface org.apache.hadoop.hbase.procedure2.store.<a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html" title="interface in org.apache.hadoop.hbase.procedure2.store">ProcedureStore.ProcedureIterator</a></dt>
 <dd>
-<div class="block">Calling this method does not need to converting the protobuf message to the Procedure class,
- so if it returns true we can call <a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
+<div class="block">Calling this method does not need to convert the protobuf message to the Procedure class, so
+ if it returns true we can call <a href="org/apache/hadoop/hbase/procedure2/store/ProcedureStore.ProcedureIterator.html#skipNext--"><code>ProcedureStore.ProcedureIterator.skipNext()</code></a> to skip the procedure without
  deserializing.</div>
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html#isNextFinished--">isNextFinished()</a></span> - Method in class org.apache.hadoop.hbase.procedure2.store.wal.<a href="org/apache/hadoop/hbase/procedure2/store/wal/WALProcedureTree.Iter.html" title="class in org.apache.hadoop.hbase.procedure2.store.wal">WALProcedureTree.Iter</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 a2ca0d5..f7aa217 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,9 +167,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.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/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.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 d4aa23c..9c3fec8 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -555,23 +555,23 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/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/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/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/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/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/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/ScannerCallable.MoreResults.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">ScannerCallable.MoreResults</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncRequestFutureImpl.Retry.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncRequestFutureImpl.Retry</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/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/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/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/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/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/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/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/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/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/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/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/AsyncProcessTask.SubmittedRows.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncProcessTask.SubmittedRows</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 e67b778..329f62f 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/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">RegionObserver.MutationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.MetaTableOps.html" title="enum in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">MetaTableMetrics.MetaTableOps</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 2aafe24..0b3542b 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -183,13 +183,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.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/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/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/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/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/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/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/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 8214ab1..f7c3bb1 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/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/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/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/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/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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..427b9f5 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" 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/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 a77bff8..c069040 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -293,10 +293,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.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 abd92a9..1799704 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.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.Action.Type.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.Action.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.balancer.<a href="../../../../../../org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.Cluster.LocalityType.html" title="enum in org.apache.hadoop.hbase.master.balancer"><span class="typeNameLink">BaseLoadBalancer.Cluster.LocalityType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 92d2987..fa12394 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -348,10 +348,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.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 59af371..96eed6e 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -215,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/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 fa88f86..9318b85 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/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/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/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/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/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/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/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/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/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 ddcc915..34c0705 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.919">ProcedureExecutor.FailedProcedure</a>&lt;TEnvironment&gt;
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.917">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.920">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.918">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.922">FailedProcedure</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.920">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.925">FailedProcedure</a>(long&nbsp;procId,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.FailedProcedure.html#line.923">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.939">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.937">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.944">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.942">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.951">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.949">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.957">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.955">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.962">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.960">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.967">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.965">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/6b8b907f/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 a836e51..ed0c0c3 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.2129">ProcedureExecutor.KeepAliveWorkerThread</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2127">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.2131">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.2129">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.2136">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.KeepAliveWorkerThread.html#line.2134">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/6b8b907f/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 4c76a29..05c9773 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.2149">ProcedureExecutor.WorkerMonitor</a>
+<pre>private final class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2147">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.2150">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.2148">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.2152">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.2150">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.2154">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.2152">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.2156">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.2154">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.2158">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.2156">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.2160">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.2158">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.2162">addWorkerStuckPercentage</a></pre>
+<pre>private&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2160">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.2163">timeoutInterval</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2161">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.2164">stuckThreshold</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2162">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.2166">WorkerMonitor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2164">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.2171">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2169">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.2179">checkForStuckWorkers</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2177">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.2195">checkThreadCount</a>(int&nbsp;stuckCount)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2193">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.2214">refreshConfig</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2212">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.2224">getTimeoutInterval</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerMonitor.html#line.2222">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/6b8b907f/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 866fefb..e39db3b 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.2050">ProcedureExecutor.WorkerThread</a>
+<pre>private class <a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html#line.2048">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.2051">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.2049">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.2052">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.2050">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.2054">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.2052">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.2058">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.2056">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.2064">sendStopSignal</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2062">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.2068">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2066">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.2109">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.2107">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.2117">getCurrentRunTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2115">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.2122">keepAlive</a>(long&nbsp;lastUpdate)</pre>
+<pre>protected&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.WorkerThread.html#line.2120">keepAlive</a>(long&nbsp;lastUpdate)</pre>
 </li>
 </ul>
 </li>


[10/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html b/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
index 8d98ec3..f2d5735 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
@@ -179,4148 +179,4147 @@
 <span class="sourceLineNo">171</span> * avoiding port contention if another local HBase instance is already running).<a name="line.171"></a>
 <span class="sourceLineNo">172</span> * &lt;p&gt;To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"<a name="line.172"></a>
 <span class="sourceLineNo">173</span> * setting it to true.<a name="line.173"></a>
-<span class="sourceLineNo">174</span> * Trigger pre commit.<a name="line.174"></a>
-<span class="sourceLineNo">175</span> */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>@InterfaceAudience.Public<a name="line.176"></a>
-<span class="sourceLineNo">177</span>@SuppressWarnings("deprecation")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * used in mini dfs.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @deprecated can be used only with mini dfs<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Deprecated<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * table.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<a name="line.194"></a>
+<span class="sourceLineNo">174</span> */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>@InterfaceAudience.Public<a name="line.175"></a>
+<span class="sourceLineNo">176</span>@SuppressWarnings("deprecation")<a name="line.176"></a>
+<span class="sourceLineNo">177</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * used in mini dfs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @deprecated can be used only with mini dfs<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Deprecated<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * table.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<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>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private MiniDFSCluster dfsCluster = null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  private MiniMRCluster mrCluster = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private volatile boolean miniClusterRunning;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private String hadoopLogDir;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    * HBaseTestingUtility*/<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private volatile Connection connection;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private static String FS_URI;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   *<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param port the port number to check for availability<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public static boolean available(int port) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ServerSocket ss = null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    DatagramSocket ds = null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    try {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ss = new ServerSocket(port);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      ss.setReuseAddress(true);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      ds = new DatagramSocket(port);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      ds.setReuseAddress(true);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return true;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    } catch (IOException e) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      // Do nothing<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } finally {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      if (ds != null) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ds.close();<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 (ss != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          ss.close();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          /* should not be thrown */<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><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * testing.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    for (Compression.Algorithm comprAlgo :<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        configurations.add(new Object[] { comprAlgo, bloomType });<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>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    configurations.add(new Object[] { false, true });<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, false });<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    configurations.add(new Object[] { true, true });<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, true });<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, false, false });<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, true });<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    configurations.add(new Object[] { false, true, false });<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, true });<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, false, false });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, true });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    configurations.add(new Object[] { true, true, false });<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return Collections.unmodifiableList(configurations);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      bloomAndCompressionCombinations();<a name="line.300"></a>
+<span class="sourceLineNo">196</span>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private MiniDFSCluster dfsCluster = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private MiniMRCluster mrCluster = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private volatile boolean miniClusterRunning;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  private String hadoopLogDir;<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    * HBaseTestingUtility*/<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile Connection connection;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private static String FS_URI;<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param port the port number to check for availability<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public static boolean available(int port) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    ServerSocket ss = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    DatagramSocket ds = null;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      ss = new ServerSocket(port);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      ss.setReuseAddress(true);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      ds = new DatagramSocket(port);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      ds.setReuseAddress(true);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return true;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // Do nothing<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    } finally {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (ds != null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        ds.close();<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>      if (ss != null) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          ss.close();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        } catch (IOException e) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          /* should not be thrown */<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return false;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * testing.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (Compression.Algorithm comprAlgo :<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        configurations.add(new Object[] { comprAlgo, bloomType });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    configurations.add(new Object[] { false, false });<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, true });<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    configurations.add(new Object[] { true, false });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, true });<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    configurations.add(new Object[] { false, false, true });<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, false });<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, true, true });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    configurations.add(new Object[] { true, false, true });<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, false });<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, true, true });<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, false });<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    return Collections.unmodifiableList(configurations);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      bloomAndCompressionCombinations();<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><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   *<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * at which point they will switch to using mini DFS for storage.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public HBaseTestingUtility() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * at which point they will switch to using mini DFS for storage.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param conf The configuration to use for further operations<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    super(conf);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Save this for when setting default file:// breaks things<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // Every cluster is a local cluster until we start DFS<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    // Note that conf could be null, but this.conf will not be<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    String dataTestDir = getDataTestDir().toString();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    // tests opt-out for random port assignment<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return a normal HBaseTestingUtility<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   */<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  @Deprecated<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @return a normal HBaseTestingUtility<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   */<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Deprecated<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return new HBaseTestingUtility(c);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    closeRegionAndWAL((HRegion)r);<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>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (r == null) return;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    r.close();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (r.getWAL() == null) return;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    r.getWAL().close();<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>  /**<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * make a copy and use that.  Do<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return Instance of Configuration.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public Configuration getConfiguration() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return super.getConfiguration();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Give it a random name so can have many concurrent tests running if<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * System property, as it's what minidfscluster bases<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * instances -- another instance could grab the temporary<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * single instance only is how the minidfscluster works.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * We also create the underlying directory for<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.425"></a>
-<span class="sourceLineNo">426</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.426"></a>
-<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * @return The calculated data test build directory, if newly-created.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  protected Path setupDataTestDir() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    Path testPath = super.setupDataTestDir();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (null == testPath) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      "hadoop.log.dir",<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      testPath, "hadoop-log-dir");<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    createSubDirAndSystemProperty(<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      "hadoop.tmp.dir",<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      testPath, "hadoop-tmp-dir");<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    createSubDir(<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      "mapreduce.cluster.local.dir",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      testPath, "mapred-local-dir");<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    String propertyName, Path parent, String subDirName){<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    String sysValue = System.getProperty(propertyName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (sysValue != null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // There is already a value set. So we do nothing but hope<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      //  that there will be no conflicts<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      String confValue = conf.get(propertyName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.466"></a>
-<span class="sourceLineNo">467</span>       LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>         propertyName + " property value differs in configuration and system: "+<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      createSubDir(propertyName, parent, subDirName);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      System.setProperty(propertyName, conf.get(propertyName));<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><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * for the test filesystem by default<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #setupDataTestDirOnTestFS()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see #getTestFileSystem()<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    FileSystem fs = getTestFileSystem();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return META table descriptor<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Deprecated<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @return META table descriptor<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * if the test relies on it.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return a unique path in the test filesystem<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    if (dataTestDirOnTestFS == null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * if the test relies on it.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a unique path in the test filesystem<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /**<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Sets up a path in test filesystem to be used by tests.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Creates a new directory if not already setup.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   */<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private void setupDataTestDirOnTestFS() throws IOException {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    if (dataTestDirOnTestFS != null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      LOG.warn("Data test on test fs dir already setup in "<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          + dataTestDirOnTestFS.toString());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<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>   * Sets up a new path in test filesystem to be used by tests.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   */<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private Path getNewDataTestDirOnTestFS() throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    //The file system can be either local, mini dfs, or if the configuration<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    //is supplied externally, it can be an external cluster FS. If it is a local<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    //file system, the tests should use getBaseTestDir, otherwise, we can use<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    //the working directory, and create a unique sub dir there<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem fs = getTestFileSystem();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path newDataTestDir;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    String randomStr = getRandomUUID().toString();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      newDataTestDir = new Path(getDataTestDir(), randomStr);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      File dataTestDir = new File(newDataTestDir.toString());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (deleteOnExit()) dataTestDir.deleteOnExit();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      Path base = getBaseTestDirOnTestFS();<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      newDataTestDir = new Path(base, randomStr);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return newDataTestDir;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<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>   * Cleans the test data directory on the test filesystem.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return True if we removed the test dirs<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean cleanupDataTestDirOnTestFS() throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    if (ret)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      dataTestDirOnTestFS = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    return ret;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Cleans a subdirectory under the test data directory on the test filesystem.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * @return True if we removed child<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * @throws IOException<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
-<span class="sourceLineNo">591</span>  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    Path cpath = getDataTestDirOnTestFS(subdirName);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    return getTestFileSystem().delete(cpath, true);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  /**<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * Start a minidfscluster.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @param servers How many DNs to start.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws Exception<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * @see #shutdownMiniDFSCluster()<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return The mini dfs cluster created.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return startMiniDFSCluster(servers, null);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Start a minidfscluster.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * This is useful if you want to run datanode on distinct hosts for things<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * like HDFS block location verification.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * If you start MiniDFSCluster without host names, all instances of the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * datanodes will have the same host name.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * @param hosts hostnames DNs to run on.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @throws Exception<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @see #shutdownMiniDFSCluster()<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @return The mini dfs cluster created.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  public MiniDFSCluster startMiniDFSCluster(final String hosts[])<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  throws Exception {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if ( hosts != null &amp;&amp; hosts.length != 0) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return startMiniDFSCluster(hosts.length, hosts);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      return startMiniDFSCluster(1, null);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Start a minidfscluster.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Can only create one.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param servers How many DNs to start.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param hosts hostnames DNs to run on.<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @throws Exception<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @see #shutdownMiniDFSCluster()<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @return The mini dfs cluster created.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[])<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  throws Exception {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return startMiniDFSCluster(servers, null, hosts);<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>  private void setFs() throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if(this.dfsCluster == null){<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      LOG.info("Skipping setting fs because dfsCluster is null");<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    FileSystem fs = this.dfsCluster.getFileSystem();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    FSUtils.setFsDefault(this.conf, new Path(fs.getUri()));<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    // re-enable this check with dfs<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);<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>  public MiniDFSCluster startMiniDFSCluster(int servers, final  String racks[], String hosts[])<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      throws Exception {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    createDirsAndSetProperties();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Error level to skip some warnings specific to the minicluster. See HBASE-4709<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.util.MBeans.class).<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.impl.MetricsSystemImpl.class).<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    TraceUtil.initTracer(conf);<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    this.dfsCluster = new MiniDFSCluster(0, this.conf, servers, true, true,<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        true, null, racks, hosts, null);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // Set this just-started cluster as our filesystem.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    setFs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Wait for the cluster to be totally up<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    this.dfsCluster.waitClusterUp();<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    //reset the test directory for test file system<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    dataTestDirOnTestFS = null;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String dataTestDir = getDataTestDir().toString();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(HConstants.HBASE_DIR, dataTestDir);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return this.dfsCluster;<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>  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    createDirsAndSetProperties();<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    dfsCluster = new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        null, null, null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return dfsCluster;<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>  /** This is used before starting HDFS and map-reduce mini-clusters */<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  private void createDirsAndSetProperties() throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    setupClusterTestDir();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    conf.set(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.setProperty(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    createDirAndSetProperty("cache_data", "test.cache.data");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    createDirAndSetProperty("hadoop_tmp", "hadoop.tmp.dir");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    hadoopLogDir = createDirAndSetProperty("hadoop_logs", "hadoop.log.dir");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    createDirAndSetProperty("mapred_local", "mapreduce.cluster.local.dir");<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    createDirAndSetProperty("mapred_temp", "mapreduce.cluster.temp.dir");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    enableShortCircuit();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Path root = getDataTestDirOnTestFS("hadoop");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    conf.set(MapreduceTestingShim.getMROutputDirProp(),<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      new Path(root, "mapred-output-dir").toString());<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set("mapreduce.jobtracker.staging.root.dir",<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    conf.set("yarn.app.mapreduce.am.staging-dir",<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      new Path(root, "mapreduce-am-staging-root-dir").toString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * at which point they will switch to using mini DFS for storage.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   */<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public HBaseTestingUtility() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   *<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   *<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * at which point they will switch to using mini DFS for storage.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param conf The configuration to use for further operations<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    super(conf);<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Save this for when setting default file:// breaks things<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Every cluster is a local cluster until we start DFS<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Note that conf could be null, but this.conf will not be<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String dataTestDir = getDataTestDir().toString();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // tests opt-out for random port assignment<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, 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>  /**<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @return a normal HBaseTestingUtility<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Deprecated<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return a normal HBaseTestingUtility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Deprecated<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new HBaseTestingUtility(c);<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>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    closeRegionAndWAL((HRegion)r);<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>  /**<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (r == null) return;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    r.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (r.getWAL() == null) return;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    r.getWAL().close();<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>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * make a copy and use that.  Do<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * @return Instance of Configuration.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public Configuration getConfiguration() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return super.getConfiguration();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Give it a random name so can have many concurrent tests running if<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * System property, as it's what minidfscluster bases<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * instances -- another instance could grab the temporary<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * single instance only is how the minidfscluster works.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * We also create the underlying directory for<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   *<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return The calculated data test build directory, if newly-created.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  protected Path setupDataTestDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Path testPath = super.setupDataTestDir();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (null == testPath) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      "hadoop.log.dir",<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      testPath, "hadoop-log-dir");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    createSubDirAndSystemProperty(<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      "hadoop.tmp.dir",<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      testPath, "hadoop-tmp-dir");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    createSubDir(<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      "mapreduce.cluster.local.dir",<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      testPath, "mapred-local-dir");<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    String propertyName, Path parent, String subDirName){<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String sysValue = System.getProperty(propertyName);<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (sysValue != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // There is already a value set. So we do nothing but hope<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      //  that there will be no conflicts<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String confValue = conf.get(propertyName);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.465"></a>
+<span class="sourceLineNo">466</span>       LOG.warn(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>         propertyName + " property value differs in configuration and system: "+<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      createSubDir(propertyName, parent, subDirName);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      System.setProperty(propertyName, conf.get(propertyName));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<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>  /**<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * for the test filesystem by default<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #setupDataTestDirOnTestFS()<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see #getTestFileSystem()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    FileSystem fs = getTestFileSystem();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>   * @return META table descriptor<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  @Deprecated<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>   * @return META table descriptor<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    } catch (IOException e) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  /**<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * if the test relies on it.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a unique path in the test filesystem<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   */<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    if (dataTestDirOnTestFS == null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * if the test relies on it.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @return a unique path in the test filesystem<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536"></a>
+<span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
+<span clas

<TRUNCATED>

[09/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 5307adc..97cc026 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -52428,6 +52428,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.html#testGetRegionByStateOfTable--">testGetRegionByStateOfTable()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi.html" title="class in org.apache.hadoop.hbase.client">TestAsyncRegionAdminApi</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAdmin2.html#testGetRegionInfo--">testGetRegionInfo()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAdmin2.html" title="class in org.apache.hadoop.hbase.client">TestAdmin2</a></dt>
+<dd>
+<div class="block">TestCase for HBASE-21355</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.html#testGetRegionLoads--">testGetRegionLoads()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncClusterAdminApi.html" title="class in org.apache.hadoop.hbase.client">TestAsyncClusterAdminApi</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi2.html#testGetRegionLocation--">testGetRegionLocation()</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncRegionAdminApi2.html" title="class in org.apache.hadoop.hbase.client">TestAsyncRegionAdminApi2</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
index 2023dd8..53aba37 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3784">HBaseTestingUtility.PortAllocator.AvailablePortChecker</a></pre>
+<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3783">HBaseTestingUtility.PortAllocator.AvailablePortChecker</a></pre>
 </li>
 </ul>
 </div>
@@ -149,7 +149,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>available</h4>
-<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html#line.3785">available</a>(int&nbsp;port)</pre>
+<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html#line.3784">available</a>(int&nbsp;port)</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
index 79bb384..a276748 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3723">HBaseTestingUtility.PortAllocator</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3722">HBaseTestingUtility.PortAllocator</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>
@@ -250,7 +250,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>MIN_RANDOM_PORT</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3724">MIN_RANDOM_PORT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3723">MIN_RANDOM_PORT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PortAllocator.MIN_RANDOM_PORT">Constant Field Values</a></dd>
@@ -263,7 +263,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>MAX_RANDOM_PORT</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3725">MAX_RANDOM_PORT</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3724">MAX_RANDOM_PORT</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PortAllocator.MAX_RANDOM_PORT">Constant Field Values</a></dd>
@@ -276,7 +276,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>takenRandomPorts</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3728">takenRandomPorts</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Set.html?is-external=true" title="class or interface in java.util">Set</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3727">takenRandomPorts</a></pre>
 <div class="block">A set of ports that have been claimed using <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#randomFreePort--"><code>randomFreePort()</code></a>.</div>
 </li>
 </ul>
@@ -286,7 +286,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>random</h4>
-<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3730">random</a></pre>
+<pre>private final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3729">random</a></pre>
 </li>
 </ul>
 <a name="portChecker">
@@ -295,7 +295,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>portChecker</h4>
-<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html" title="interface in org.apache.hadoop.hbase">HBaseTestingUtility.PortAllocator.AvailablePortChecker</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3731">portChecker</a></pre>
+<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html" title="interface in org.apache.hadoop.hbase">HBaseTestingUtility.PortAllocator.AvailablePortChecker</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3730">portChecker</a></pre>
 </li>
 </ul>
 </li>
@@ -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>PortAllocator</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3733">PortAllocator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3732">PortAllocator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random)</pre>
 </li>
 </ul>
 <a name="PortAllocator-java.util.Random-org.apache.hadoop.hbase.HBaseTestingUtility.PortAllocator.AvailablePortChecker-">
@@ -321,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PortAllocator</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3749">PortAllocator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3748">PortAllocator</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
                      <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.AvailablePortChecker.html" title="interface in org.apache.hadoop.hbase">HBaseTestingUtility.PortAllocator.AvailablePortChecker</a>&nbsp;portChecker)</pre>
 </li>
 </ul>
@@ -339,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>randomFreePort</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3758">randomFreePort</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3757">randomFreePort</a>()</pre>
 <div class="block">Returns a random free port and marks that port as taken. Not thread-safe. Expected to be
  called from single-threaded test setup code/</div>
 </li>
@@ -350,7 +350,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>randomPort</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3779">randomPort</a>()</pre>
+<pre>private&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html#line.3778">randomPort</a>()</pre>
 <div class="block">Returns a random port. These ports cannot be registered with IANA and are
  intended for dynamic allocation (see http://bit.ly/dynports).</div>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
index 8076874..f92edd1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2123">HBaseTestingUtility.SeenRowTracker</a>
+<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2122">HBaseTestingUtility.SeenRowTracker</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 tracker for tracking and validating table rows
  generated with <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#loadTable-org.apache.hadoop.hbase.client.Table-byte:A-"><code>HBaseTestingUtility.loadTable(Table, byte[])</code></a></div>
@@ -231,7 +231,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>dim</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2124">dim</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2123">dim</a></pre>
 </li>
 </ul>
 <a name="seenRows">
@@ -240,7 +240,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>seenRows</h4>
-<pre>int[][][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2125">seenRows</a></pre>
+<pre>int[][][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2124">seenRows</a></pre>
 </li>
 </ul>
 <a name="startRow">
@@ -249,7 +249,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRow</h4>
-<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2126">startRow</a></pre>
+<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2125">startRow</a></pre>
 </li>
 </ul>
 <a name="stopRow">
@@ -258,7 +258,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>stopRow</h4>
-<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2127">stopRow</a></pre>
+<pre>byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2126">stopRow</a></pre>
 </li>
 </ul>
 </li>
@@ -275,7 +275,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SeenRowTracker</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2129">SeenRowTracker</a>(byte[]&nbsp;startRow,
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2128">SeenRowTracker</a>(byte[]&nbsp;startRow,
                       byte[]&nbsp;stopRow)</pre>
 </li>
 </ul>
@@ -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>reset</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2134">reset</a>()</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2133">reset</a>()</pre>
 </li>
 </ul>
 <a name="i-byte-">
@@ -302,7 +302,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>i</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2140">i</a>(byte&nbsp;b)</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2139">i</a>(byte&nbsp;b)</pre>
 </li>
 </ul>
 <a name="addRow-byte:A-">
@@ -311,7 +311,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2144">addRow</a>(byte[]&nbsp;row)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2143">addRow</a>(byte[]&nbsp;row)</pre>
 </li>
 </ul>
 <a name="validate--">
@@ -320,7 +320,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>validate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2151">validate</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html#line.2150">validate</a>()</pre>
 <div class="block">Validate that all the rows between startRow and stopRow are seen exactly once, and
  all other rows none</div>
 </li>


[05/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
index 8d98ec3..f2d5735 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html
@@ -179,4148 +179,4147 @@
 <span class="sourceLineNo">171</span> * avoiding port contention if another local HBase instance is already running).<a name="line.171"></a>
 <span class="sourceLineNo">172</span> * &lt;p&gt;To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"<a name="line.172"></a>
 <span class="sourceLineNo">173</span> * setting it to true.<a name="line.173"></a>
-<span class="sourceLineNo">174</span> * Trigger pre commit.<a name="line.174"></a>
-<span class="sourceLineNo">175</span> */<a name="line.175"></a>
-<span class="sourceLineNo">176</span>@InterfaceAudience.Public<a name="line.176"></a>
-<span class="sourceLineNo">177</span>@SuppressWarnings("deprecation")<a name="line.177"></a>
-<span class="sourceLineNo">178</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * used in mini dfs.<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @deprecated can be used only with mini dfs<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  @Deprecated<a name="line.186"></a>
-<span class="sourceLineNo">187</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.187"></a>
-<span class="sourceLineNo">188</span><a name="line.188"></a>
-<span class="sourceLineNo">189</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.189"></a>
-<span class="sourceLineNo">190</span>  /**<a name="line.190"></a>
-<span class="sourceLineNo">191</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * table.<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   */<a name="line.193"></a>
-<span class="sourceLineNo">194</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<a name="line.194"></a>
+<span class="sourceLineNo">174</span> */<a name="line.174"></a>
+<span class="sourceLineNo">175</span>@InterfaceAudience.Public<a name="line.175"></a>
+<span class="sourceLineNo">176</span>@SuppressWarnings("deprecation")<a name="line.176"></a>
+<span class="sourceLineNo">177</span>public class HBaseTestingUtility extends HBaseZKTestingUtility {<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>   * System property key to get test directory value. Name is as it is because mini dfs has<a name="line.180"></a>
+<span class="sourceLineNo">181</span>   * hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * used in mini dfs.<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @deprecated can be used only with mini dfs<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  @Deprecated<a name="line.185"></a>
+<span class="sourceLineNo">186</span>  private static final String TEST_DIRECTORY_KEY = "test.build.data";<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";<a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * The default number of regions per regionserver when creating a pre-split<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * table.<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   */<a name="line.192"></a>
+<span class="sourceLineNo">193</span>  public static final int DEFAULT_REGIONS_PER_SERVER = 3;<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>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.198"></a>
-<span class="sourceLineNo">199</span><a name="line.199"></a>
-<span class="sourceLineNo">200</span>  private MiniDFSCluster dfsCluster = null;<a name="line.200"></a>
-<span class="sourceLineNo">201</span><a name="line.201"></a>
-<span class="sourceLineNo">202</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.202"></a>
-<span class="sourceLineNo">203</span>  private MiniMRCluster mrCluster = null;<a name="line.203"></a>
-<span class="sourceLineNo">204</span><a name="line.204"></a>
-<span class="sourceLineNo">205</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.205"></a>
-<span class="sourceLineNo">206</span>  private volatile boolean miniClusterRunning;<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>  private String hadoopLogDir;<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    * HBaseTestingUtility*/<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  private volatile Connection connection;<a name="line.217"></a>
-<span class="sourceLineNo">218</span><a name="line.218"></a>
-<span class="sourceLineNo">219</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  private static String FS_URI;<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   *<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @param port the port number to check for availability<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   */<a name="line.230"></a>
-<span class="sourceLineNo">231</span>  public static boolean available(int port) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ServerSocket ss = null;<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    DatagramSocket ds = null;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    try {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      ss = new ServerSocket(port);<a name="line.235"></a>
-<span class="sourceLineNo">236</span>      ss.setReuseAddress(true);<a name="line.236"></a>
-<span class="sourceLineNo">237</span>      ds = new DatagramSocket(port);<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      ds.setReuseAddress(true);<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      return true;<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    } catch (IOException e) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      // Do nothing<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    } finally {<a name="line.242"></a>
-<span class="sourceLineNo">243</span>      if (ds != null) {<a name="line.243"></a>
-<span class="sourceLineNo">244</span>        ds.close();<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 (ss != null) {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        try {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>          ss.close();<a name="line.249"></a>
-<span class="sourceLineNo">250</span>        } catch (IOException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>          /* should not be thrown */<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><a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return false;<a name="line.256"></a>
-<span class="sourceLineNo">257</span>  }<a name="line.257"></a>
-<span class="sourceLineNo">258</span><a name="line.258"></a>
-<span class="sourceLineNo">259</span>  /**<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * testing.<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   */<a name="line.262"></a>
-<span class="sourceLineNo">263</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.263"></a>
-<span class="sourceLineNo">264</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.264"></a>
-<span class="sourceLineNo">265</span>    for (Compression.Algorithm comprAlgo :<a name="line.265"></a>
-<span class="sourceLineNo">266</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        configurations.add(new Object[] { comprAlgo, bloomType });<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>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   */<a name="line.276"></a>
-<span class="sourceLineNo">277</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>    configurations.add(new Object[] { false, true });<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, false });<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    configurations.add(new Object[] { true, true });<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, true });<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, false, false });<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, true });<a name="line.290"></a>
-<span class="sourceLineNo">291</span>    configurations.add(new Object[] { false, true, false });<a name="line.291"></a>
-<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, true });<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, false, false });<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, true });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    configurations.add(new Object[] { true, true, false });<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    return Collections.unmodifiableList(configurations);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>  }<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.299"></a>
-<span class="sourceLineNo">300</span>      bloomAndCompressionCombinations();<a name="line.300"></a>
+<span class="sourceLineNo">196</span>  public static final String PRESPLIT_TEST_TABLE_KEY = "hbase.test.pre-split-table";<a name="line.196"></a>
+<span class="sourceLineNo">197</span>  public static final boolean PRESPLIT_TEST_TABLE = true;<a name="line.197"></a>
+<span class="sourceLineNo">198</span><a name="line.198"></a>
+<span class="sourceLineNo">199</span>  private MiniDFSCluster dfsCluster = null;<a name="line.199"></a>
+<span class="sourceLineNo">200</span><a name="line.200"></a>
+<span class="sourceLineNo">201</span>  private volatile HBaseCluster hbaseCluster = null;<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  private MiniMRCluster mrCluster = null;<a name="line.202"></a>
+<span class="sourceLineNo">203</span><a name="line.203"></a>
+<span class="sourceLineNo">204</span>  /** If there is a mini cluster running for this testing utility instance. */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  private volatile boolean miniClusterRunning;<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  private String hadoopLogDir;<a name="line.207"></a>
+<span class="sourceLineNo">208</span><a name="line.208"></a>
+<span class="sourceLineNo">209</span>  /** Directory on test filesystem where we put the data for this instance of<a name="line.209"></a>
+<span class="sourceLineNo">210</span>    * HBaseTestingUtility*/<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  private Path dataTestDirOnTestFS = null;<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>   * Shared cluster connection.<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  private volatile Connection connection;<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  /** Filesystem URI used for map-reduce mini-cluster setup */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  private static String FS_URI;<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /** This is for unit tests parameterized with a single boolean. */<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();<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>   * Checks to see if a specific port is available.<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   *<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @param port the port number to check for availability<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not<a name="line.228"></a>
+<span class="sourceLineNo">229</span>   */<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  public static boolean available(int port) {<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    ServerSocket ss = null;<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    DatagramSocket ds = null;<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    try {<a name="line.233"></a>
+<span class="sourceLineNo">234</span>      ss = new ServerSocket(port);<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      ss.setReuseAddress(true);<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      ds = new DatagramSocket(port);<a name="line.236"></a>
+<span class="sourceLineNo">237</span>      ds.setReuseAddress(true);<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      return true;<a name="line.238"></a>
+<span class="sourceLineNo">239</span>    } catch (IOException e) {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>      // Do nothing<a name="line.240"></a>
+<span class="sourceLineNo">241</span>    } finally {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>      if (ds != null) {<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        ds.close();<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>      if (ss != null) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>        try {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>          ss.close();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        } catch (IOException e) {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>          /* should not be thrown */<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><a name="line.254"></a>
+<span class="sourceLineNo">255</span>    return false;<a name="line.255"></a>
+<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
+<span class="sourceLineNo">257</span><a name="line.257"></a>
+<span class="sourceLineNo">258</span>  /**<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * Create all combinations of Bloom filters and compression algorithms for<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   * testing.<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   */<a name="line.261"></a>
+<span class="sourceLineNo">262</span>  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.263"></a>
+<span class="sourceLineNo">264</span>    for (Compression.Algorithm comprAlgo :<a name="line.264"></a>
+<span class="sourceLineNo">265</span>         HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      for (BloomType bloomType : BloomType.values()) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        configurations.add(new Object[] { comprAlgo, bloomType });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    }<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    return Collections.unmodifiableList(configurations);<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>   * Create combination of memstoreTS and tags<a name="line.274"></a>
+<span class="sourceLineNo">275</span>   */<a name="line.275"></a>
+<span class="sourceLineNo">276</span>  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    configurations.add(new Object[] { false, false });<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    configurations.add(new Object[] { false, true });<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    configurations.add(new Object[] { true, false });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    configurations.add(new Object[] { true, true });<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    return Collections.unmodifiableList(configurations);<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 static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    configurations.add(new Object[] { false, false, true });<a name="line.287"></a>
+<span class="sourceLineNo">288</span>    configurations.add(new Object[] { false, false, false });<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    configurations.add(new Object[] { false, true, true });<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    configurations.add(new Object[] { false, true, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    configurations.add(new Object[] { true, false, true });<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    configurations.add(new Object[] { true, false, false });<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    configurations.add(new Object[] { true, true, true });<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    configurations.add(new Object[] { true, true, false });<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    return Collections.unmodifiableList(configurations);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>  }<a name="line.296"></a>
+<span class="sourceLineNo">297</span><a name="line.297"></a>
+<span class="sourceLineNo">298</span>  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      bloomAndCompressionCombinations();<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><a name="line.302"></a>
-<span class="sourceLineNo">303</span>  /**<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   *<a name="line.305"></a>
-<span class="sourceLineNo">306</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.307"></a>
-<span class="sourceLineNo">308</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.308"></a>
-<span class="sourceLineNo">309</span>   *<a name="line.309"></a>
-<span class="sourceLineNo">310</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.310"></a>
-<span class="sourceLineNo">311</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.311"></a>
-<span class="sourceLineNo">312</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.312"></a>
-<span class="sourceLineNo">313</span>   * at which point they will switch to using mini DFS for storage.<a name="line.313"></a>
-<span class="sourceLineNo">314</span>   */<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public HBaseTestingUtility() {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.320"></a>
-<span class="sourceLineNo">321</span>   *<a name="line.321"></a>
-<span class="sourceLineNo">322</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.322"></a>
-<span class="sourceLineNo">323</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.323"></a>
-<span class="sourceLineNo">324</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.324"></a>
-<span class="sourceLineNo">325</span>   *<a name="line.325"></a>
-<span class="sourceLineNo">326</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.326"></a>
-<span class="sourceLineNo">327</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.327"></a>
-<span class="sourceLineNo">328</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>   * at which point they will switch to using mini DFS for storage.<a name="line.329"></a>
-<span class="sourceLineNo">330</span>   *<a name="line.330"></a>
-<span class="sourceLineNo">331</span>   * @param conf The configuration to use for further operations<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   */<a name="line.332"></a>
-<span class="sourceLineNo">333</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.333"></a>
-<span class="sourceLineNo">334</span>    super(conf);<a name="line.334"></a>
-<span class="sourceLineNo">335</span><a name="line.335"></a>
-<span class="sourceLineNo">336</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.337"></a>
-<span class="sourceLineNo">338</span><a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Save this for when setting default file:// breaks things<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    }<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    // Every cluster is a local cluster until we start DFS<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    // Note that conf could be null, but this.conf will not be<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    String dataTestDir = getDataTestDir().toString();<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    // tests opt-out for random port assignment<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.360"></a>
-<span class="sourceLineNo">361</span>   * @return a normal HBaseTestingUtility<a name="line.361"></a>
-<span class="sourceLineNo">362</span>   */<a name="line.362"></a>
-<span class="sourceLineNo">363</span>  @Deprecated<a name="line.363"></a>
-<span class="sourceLineNo">364</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.364"></a>
-<span class="sourceLineNo">365</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   * @return a normal HBaseTestingUtility<a name="line.370"></a>
-<span class="sourceLineNo">371</span>   */<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  @Deprecated<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    return new HBaseTestingUtility(c);<a name="line.374"></a>
-<span class="sourceLineNo">375</span>  }<a name="line.375"></a>
-<span class="sourceLineNo">376</span><a name="line.376"></a>
-<span class="sourceLineNo">377</span>  /**<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   */<a name="line.379"></a>
-<span class="sourceLineNo">380</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>    closeRegionAndWAL((HRegion)r);<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>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.385"></a>
-<span class="sourceLineNo">386</span>   */<a name="line.386"></a>
-<span class="sourceLineNo">387</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    if (r == null) return;<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    r.close();<a name="line.389"></a>
-<span class="sourceLineNo">390</span>    if (r.getWAL() == null) return;<a name="line.390"></a>
-<span class="sourceLineNo">391</span>    r.getWAL().close();<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>  /**<a name="line.394"></a>
-<span class="sourceLineNo">395</span>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.395"></a>
-<span class="sourceLineNo">396</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.396"></a>
-<span class="sourceLineNo">397</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.397"></a>
-<span class="sourceLineNo">398</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.398"></a>
-<span class="sourceLineNo">399</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.399"></a>
-<span class="sourceLineNo">400</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * make a copy and use that.  Do<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return Instance of Configuration.<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public Configuration getConfiguration() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return super.getConfiguration();<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  }<a name="line.408"></a>
-<span class="sourceLineNo">409</span><a name="line.409"></a>
-<span class="sourceLineNo">410</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.415"></a>
-<span class="sourceLineNo">416</span>   * Give it a random name so can have many concurrent tests running if<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   * System property, as it's what minidfscluster bases<a name="line.418"></a>
-<span class="sourceLineNo">419</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.419"></a>
-<span class="sourceLineNo">420</span>   * instances -- another instance could grab the temporary<a name="line.420"></a>
-<span class="sourceLineNo">421</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * single instance only is how the minidfscluster works.<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   *<a name="line.423"></a>
-<span class="sourceLineNo">424</span>   * We also create the underlying directory for<a name="line.424"></a>
-<span class="sourceLineNo">425</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.425"></a>
-<span class="sourceLineNo">426</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.426"></a>
-<span class="sourceLineNo">427</span>   *<a name="line.427"></a>
-<span class="sourceLineNo">428</span>   * @return The calculated data test build directory, if newly-created.<a name="line.428"></a>
-<span class="sourceLineNo">429</span>   */<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  @Override<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  protected Path setupDataTestDir() {<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    Path testPath = super.setupDataTestDir();<a name="line.432"></a>
-<span class="sourceLineNo">433</span>    if (null == testPath) {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.437"></a>
-<span class="sourceLineNo">438</span>      "hadoop.log.dir",<a name="line.438"></a>
-<span class="sourceLineNo">439</span>      testPath, "hadoop-log-dir");<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    createSubDirAndSystemProperty(<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      "hadoop.tmp.dir",<a name="line.444"></a>
-<span class="sourceLineNo">445</span>      testPath, "hadoop-tmp-dir");<a name="line.445"></a>
-<span class="sourceLineNo">446</span><a name="line.446"></a>
-<span class="sourceLineNo">447</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    createSubDir(<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      "mapreduce.cluster.local.dir",<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      testPath, "mapred-local-dir");<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    String propertyName, Path parent, String subDirName){<a name="line.456"></a>
-<span class="sourceLineNo">457</span><a name="line.457"></a>
-<span class="sourceLineNo">458</span>    String sysValue = System.getProperty(propertyName);<a name="line.458"></a>
-<span class="sourceLineNo">459</span><a name="line.459"></a>
-<span class="sourceLineNo">460</span>    if (sysValue != null) {<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // There is already a value set. So we do nothing but hope<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      //  that there will be no conflicts<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.463"></a>
-<span class="sourceLineNo">464</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      String confValue = conf.get(propertyName);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.466"></a>
-<span class="sourceLineNo">467</span>       LOG.warn(<a name="line.467"></a>
-<span class="sourceLineNo">468</span>         propertyName + " property value differs in configuration and system: "+<a name="line.468"></a>
-<span class="sourceLineNo">469</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.469"></a>
-<span class="sourceLineNo">470</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    } else {<a name="line.474"></a>
-<span class="sourceLineNo">475</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      createSubDir(propertyName, parent, subDirName);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      System.setProperty(propertyName, conf.get(propertyName));<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><a name="line.480"></a>
-<span class="sourceLineNo">481</span>  /**<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * for the test filesystem by default<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   * @see #setupDataTestDirOnTestFS()<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @see #getTestFileSystem()<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    FileSystem fs = getTestFileSystem();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>  /**<a name="line.492"></a>
-<span class="sourceLineNo">493</span>   * @return META table descriptor<a name="line.493"></a>
-<span class="sourceLineNo">494</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   */<a name="line.496"></a>
-<span class="sourceLineNo">497</span>  @Deprecated<a name="line.497"></a>
-<span class="sourceLineNo">498</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>  /**<a name="line.502"></a>
-<span class="sourceLineNo">503</span>   * @return META table descriptor<a name="line.503"></a>
-<span class="sourceLineNo">504</span>   */<a name="line.504"></a>
-<span class="sourceLineNo">505</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    try {<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    } catch (IOException e) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    }<a name="line.510"></a>
-<span class="sourceLineNo">511</span>  }<a name="line.511"></a>
-<span class="sourceLineNo">512</span><a name="line.512"></a>
-<span class="sourceLineNo">513</span>  /**<a name="line.513"></a>
-<span class="sourceLineNo">514</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.514"></a>
-<span class="sourceLineNo">515</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.515"></a>
-<span class="sourceLineNo">516</span>   * if the test relies on it.<a name="line.516"></a>
-<span class="sourceLineNo">517</span>   * @return a unique path in the test filesystem<a name="line.517"></a>
-<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
-<span class="sourceLineNo">519</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    if (dataTestDirOnTestFS == null) {<a name="line.520"></a>
-<span class="sourceLineNo">521</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  }<a name="line.525"></a>
-<span class="sourceLineNo">526</span><a name="line.526"></a>
-<span class="sourceLineNo">527</span>  /**<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   * if the test relies on it.<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return a unique path in the test filesystem<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.532"></a>
-<span class="sourceLineNo">533</span>   */<a name="line.533"></a>
-<span class="sourceLineNo">534</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.535"></a>
-<span class="sourceLineNo">536</span>  }<a name="line.536"></a>
-<span class="sourceLineNo">537</span><a name="line.537"></a>
-<span class="sourceLineNo">538</span>  /**<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Sets up a path in test filesystem to be used by tests.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * Creates a new directory if not already setup.<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   */<a name="line.541"></a>
-<span class="sourceLineNo">542</span>  private void setupDataTestDirOnTestFS() throws IOException {<a name="line.542"></a>
-<span class="sourceLineNo">543</span>    if (dataTestDirOnTestFS != null) {<a name="line.543"></a>
-<span class="sourceLineNo">544</span>      LOG.warn("Data test on test fs dir already setup in "<a name="line.544"></a>
-<span class="sourceLineNo">545</span>          + dataTestDirOnTestFS.toString());<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      return;<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    }<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();<a name="line.548"></a>
-<span class="sourceLineNo">549</span>  }<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>   * Sets up a new path in test filesystem to be used by tests.<a name="line.552"></a>
-<span class="sourceLineNo">553</span>   */<a name="line.553"></a>
-<span class="sourceLineNo">554</span>  private Path getNewDataTestDirOnTestFS() throws IOException {<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    //The file system can be either local, mini dfs, or if the configuration<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    //is supplied externally, it can be an external cluster FS. If it is a local<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    //file system, the tests should use getBaseTestDir, otherwise, we can use<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    //the working directory, and create a unique sub dir there<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    FileSystem fs = getTestFileSystem();<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path newDataTestDir;<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    String randomStr = getRandomUUID().toString();<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      newDataTestDir = new Path(getDataTestDir(), randomStr);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      File dataTestDir = new File(newDataTestDir.toString());<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      if (deleteOnExit()) dataTestDir.deleteOnExit();<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    } else {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      Path base = getBaseTestDirOnTestFS();<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      newDataTestDir = new Path(base, randomStr);<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    return newDataTestDir;<a name="line.571"></a>
-<span class="sourceLineNo">572</span>  }<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>   * Cleans the test data directory on the test filesystem.<a name="line.575"></a>
-<span class="sourceLineNo">576</span>   * @return True if we removed the test dirs<a name="line.576"></a>
-<span class="sourceLineNo">577</span>   * @throws IOException<a name="line.577"></a>
-<span class="sourceLineNo">578</span>   */<a name="line.578"></a>
-<span class="sourceLineNo">579</span>  public boolean cleanupDataTestDirOnTestFS() throws IOException {<a name="line.579"></a>
-<span class="sourceLineNo">580</span>    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>    if (ret)<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      dataTestDirOnTestFS = null;<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    return ret;<a name="line.583"></a>
-<span class="sourceLineNo">584</span>  }<a name="line.584"></a>
-<span class="sourceLineNo">585</span><a name="line.585"></a>
-<span class="sourceLineNo">586</span>  /**<a name="line.586"></a>
-<span class="sourceLineNo">587</span>   * Cleans a subdirectory under the test data directory on the test filesystem.<a name="line.587"></a>
-<span class="sourceLineNo">588</span>   * @return True if we removed child<a name="line.588"></a>
-<span class="sourceLineNo">589</span>   * @throws IOException<a name="line.589"></a>
-<span class="sourceLineNo">590</span>   */<a name="line.590"></a>
-<span class="sourceLineNo">591</span>  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    Path cpath = getDataTestDirOnTestFS(subdirName);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>    return getTestFileSystem().delete(cpath, true);<a name="line.593"></a>
-<span class="sourceLineNo">594</span>  }<a name="line.594"></a>
-<span class="sourceLineNo">595</span><a name="line.595"></a>
-<span class="sourceLineNo">596</span>  /**<a name="line.596"></a>
-<span class="sourceLineNo">597</span>   * Start a minidfscluster.<a name="line.597"></a>
-<span class="sourceLineNo">598</span>   * @param servers How many DNs to start.<a name="line.598"></a>
-<span class="sourceLineNo">599</span>   * @throws Exception<a name="line.599"></a>
-<span class="sourceLineNo">600</span>   * @see #shutdownMiniDFSCluster()<a name="line.600"></a>
-<span class="sourceLineNo">601</span>   * @return The mini dfs cluster created.<a name="line.601"></a>
-<span class="sourceLineNo">602</span>   */<a name="line.602"></a>
-<span class="sourceLineNo">603</span>  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    return startMiniDFSCluster(servers, null);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
-<span class="sourceLineNo">606</span><a name="line.606"></a>
-<span class="sourceLineNo">607</span>  /**<a name="line.607"></a>
-<span class="sourceLineNo">608</span>   * Start a minidfscluster.<a name="line.608"></a>
-<span class="sourceLineNo">609</span>   * This is useful if you want to run datanode on distinct hosts for things<a name="line.609"></a>
-<span class="sourceLineNo">610</span>   * like HDFS block location verification.<a name="line.610"></a>
-<span class="sourceLineNo">611</span>   * If you start MiniDFSCluster without host names, all instances of the<a name="line.611"></a>
-<span class="sourceLineNo">612</span>   * datanodes will have the same host name.<a name="line.612"></a>
-<span class="sourceLineNo">613</span>   * @param hosts hostnames DNs to run on.<a name="line.613"></a>
-<span class="sourceLineNo">614</span>   * @throws Exception<a name="line.614"></a>
-<span class="sourceLineNo">615</span>   * @see #shutdownMiniDFSCluster()<a name="line.615"></a>
-<span class="sourceLineNo">616</span>   * @return The mini dfs cluster created.<a name="line.616"></a>
-<span class="sourceLineNo">617</span>   */<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  public MiniDFSCluster startMiniDFSCluster(final String hosts[])<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  throws Exception {<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    if ( hosts != null &amp;&amp; hosts.length != 0) {<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      return startMiniDFSCluster(hosts.length, hosts);<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    } else {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      return startMiniDFSCluster(1, null);<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  }<a name="line.625"></a>
-<span class="sourceLineNo">626</span><a name="line.626"></a>
-<span class="sourceLineNo">627</span>  /**<a name="line.627"></a>
-<span class="sourceLineNo">628</span>   * Start a minidfscluster.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>   * Can only create one.<a name="line.629"></a>
-<span class="sourceLineNo">630</span>   * @param servers How many DNs to start.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>   * @param hosts hostnames DNs to run on.<a name="line.631"></a>
-<span class="sourceLineNo">632</span>   * @throws Exception<a name="line.632"></a>
-<span class="sourceLineNo">633</span>   * @see #shutdownMiniDFSCluster()<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * @return The mini dfs cluster created.<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   */<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[])<a name="line.636"></a>
-<span class="sourceLineNo">637</span>  throws Exception {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    return startMiniDFSCluster(servers, null, hosts);<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>  private void setFs() throws IOException {<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if(this.dfsCluster == null){<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      LOG.info("Skipping setting fs because dfsCluster is null");<a name="line.643"></a>
-<span class="sourceLineNo">644</span>      return;<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    }<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    FileSystem fs = this.dfsCluster.getFileSystem();<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    FSUtils.setFsDefault(this.conf, new Path(fs.getUri()));<a name="line.647"></a>
-<span class="sourceLineNo">648</span><a name="line.648"></a>
-<span class="sourceLineNo">649</span>    // re-enable this check with dfs<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);<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>  public MiniDFSCluster startMiniDFSCluster(int servers, final  String racks[], String hosts[])<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      throws Exception {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    createDirsAndSetProperties();<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Error level to skip some warnings specific to the minicluster. See HBASE-4709<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.util.MBeans.class).<a name="line.659"></a>
-<span class="sourceLineNo">660</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    org.apache.log4j.Logger.getLogger(org.apache.hadoop.metrics2.impl.MetricsSystemImpl.class).<a name="line.661"></a>
-<span class="sourceLineNo">662</span>        setLevel(org.apache.log4j.Level.ERROR);<a name="line.662"></a>
-<span class="sourceLineNo">663</span><a name="line.663"></a>
-<span class="sourceLineNo">664</span>    TraceUtil.initTracer(conf);<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>    this.dfsCluster = new MiniDFSCluster(0, this.conf, servers, true, true,<a name="line.666"></a>
-<span class="sourceLineNo">667</span>        true, null, racks, hosts, null);<a name="line.667"></a>
-<span class="sourceLineNo">668</span><a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // Set this just-started cluster as our filesystem.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    setFs();<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // Wait for the cluster to be totally up<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    this.dfsCluster.waitClusterUp();<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    //reset the test directory for test file system<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    dataTestDirOnTestFS = null;<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    String dataTestDir = getDataTestDir().toString();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    conf.set(HConstants.HBASE_DIR, dataTestDir);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.679"></a>
-<span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    return this.dfsCluster;<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>  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    createDirsAndSetProperties();<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    dfsCluster = new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null,<a name="line.686"></a>
-<span class="sourceLineNo">687</span>        null, null, null);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    return dfsCluster;<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>  /** This is used before starting HDFS and map-reduce mini-clusters */<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  private void createDirsAndSetProperties() throws IOException {<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    setupClusterTestDir();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    conf.set(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    System.setProperty(TEST_DIRECTORY_KEY, clusterTestDir.getPath());<a name="line.695"></a>
-<span class="sourceLineNo">696</span>    createDirAndSetProperty("cache_data", "test.cache.data");<a name="line.696"></a>
-<span class="sourceLineNo">697</span>    createDirAndSetProperty("hadoop_tmp", "hadoop.tmp.dir");<a name="line.697"></a>
-<span class="sourceLineNo">698</span>    hadoopLogDir = createDirAndSetProperty("hadoop_logs", "hadoop.log.dir");<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    createDirAndSetProperty("mapred_local", "mapreduce.cluster.local.dir");<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    createDirAndSetProperty("mapred_temp", "mapreduce.cluster.temp.dir");<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    enableShortCircuit();<a name="line.701"></a>
-<span class="sourceLineNo">702</span><a name="line.702"></a>
-<span class="sourceLineNo">703</span>    Path root = getDataTestDirOnTestFS("hadoop");<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    conf.set(MapreduceTestingShim.getMROutputDirProp(),<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      new Path(root, "mapred-output-dir").toString());<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    conf.set("mapreduce.jobtracker.staging.root.dir",<a name="line.707"></a>
-<span class="sourceLineNo">708</span>      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    conf.set("yarn.app.mapreduce.am.staging-dir",<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      new Path(root, "mapreduce-am-staging-root-dir").toString());<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
+<span class="sourceLineNo">302</span>  /**<a name="line.302"></a>
+<span class="sourceLineNo">303</span>   * &lt;p&gt;Create an HBaseTestingUtility using a default configuration.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   *<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * at which point they will switch to using mini DFS for storage.<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   */<a name="line.313"></a>
+<span class="sourceLineNo">314</span>  public HBaseTestingUtility() {<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this(HBaseConfiguration.create());<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>   * &lt;p&gt;Create an HBaseTestingUtility using a given configuration.<a name="line.319"></a>
+<span class="sourceLineNo">320</span>   *<a name="line.320"></a>
+<span class="sourceLineNo">321</span>   * &lt;p&gt;Initially, all tmp files are written to a local test data directory.<a name="line.321"></a>
+<span class="sourceLineNo">322</span>   * Once {@link #startMiniDFSCluster} is called, either directly or via<a name="line.322"></a>
+<span class="sourceLineNo">323</span>   * {@link #startMiniCluster()}, tmp data will be written to the DFS directory instead.<a name="line.323"></a>
+<span class="sourceLineNo">324</span>   *<a name="line.324"></a>
+<span class="sourceLineNo">325</span>   * &lt;p&gt;Previously, there was a distinction between the type of utility returned by<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * {@link #createLocalHTU()} and this constructor; this is no longer the case. All<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * HBaseTestingUtility objects will behave as local until a DFS cluster is started,<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * at which point they will switch to using mini DFS for storage.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param conf The configuration to use for further operations<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   */<a name="line.331"></a>
+<span class="sourceLineNo">332</span>  public HBaseTestingUtility(@Nullable Configuration conf) {<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    super(conf);<a name="line.333"></a>
+<span class="sourceLineNo">334</span><a name="line.334"></a>
+<span class="sourceLineNo">335</span>    // a hbase checksum verification failure will cause unit tests to fail<a name="line.335"></a>
+<span class="sourceLineNo">336</span>    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);<a name="line.336"></a>
+<span class="sourceLineNo">337</span><a name="line.337"></a>
+<span class="sourceLineNo">338</span>    // Save this for when setting default file:// breaks things<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    if (this.conf.get("fs.defaultFS") != null) {<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));<a name="line.340"></a>
+<span class="sourceLineNo">341</span>    }<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (this.conf.get(HConstants.HBASE_DIR) != null) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // Every cluster is a local cluster until we start DFS<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Note that conf could be null, but this.conf will not be<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    String dataTestDir = getDataTestDir().toString();<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    this.conf.set("fs.defaultFS","file:///");<a name="line.348"></a>
+<span class="sourceLineNo">349</span>    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE,false);<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // If the value for random ports isn't set set it to true, thus making<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    // tests opt-out for random port assignment<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, 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>  /**<a name="line.358"></a>
+<span class="sourceLineNo">359</span>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility()} instead<a name="line.359"></a>
+<span class="sourceLineNo">360</span>   * @return a normal HBaseTestingUtility<a name="line.360"></a>
+<span class="sourceLineNo">361</span>   */<a name="line.361"></a>
+<span class="sourceLineNo">362</span>  @Deprecated<a name="line.362"></a>
+<span class="sourceLineNo">363</span>  public static HBaseTestingUtility createLocalHTU() {<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    return new HBaseTestingUtility();<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>   * @deprecated use {@link HBaseTestingUtility#HBaseTestingUtility(Configuration)} instead<a name="line.368"></a>
+<span class="sourceLineNo">369</span>   * @return a normal HBaseTestingUtility<a name="line.369"></a>
+<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  @Deprecated<a name="line.371"></a>
+<span class="sourceLineNo">372</span>  public static HBaseTestingUtility createLocalHTU(Configuration c) {<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    return new HBaseTestingUtility(c);<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>  /**<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   * Close both the region {@code r} and it's underlying WAL. For use in tests.<a name="line.377"></a>
+<span class="sourceLineNo">378</span>   */<a name="line.378"></a>
+<span class="sourceLineNo">379</span>  public static void closeRegionAndWAL(final Region r) throws IOException {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    closeRegionAndWAL((HRegion)r);<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>  /**<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   */<a name="line.385"></a>
+<span class="sourceLineNo">386</span>  public static void closeRegionAndWAL(final HRegion r) throws IOException {<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    if (r == null) return;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    r.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    if (r.getWAL() == null) return;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    r.getWAL().close();<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>   * Returns this classes's instance of {@link Configuration}.  Be careful how<a name="line.394"></a>
+<span class="sourceLineNo">395</span>   * you use the returned Configuration since {@link Connection} instances<a name="line.395"></a>
+<span class="sourceLineNo">396</span>   * can be shared.  The Map of Connections is keyed by the Configuration.  If<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * say, a Connection was being used against a cluster that had been shutdown,<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   * see {@link #shutdownMiniCluster()}, then the Connection will no longer<a name="line.398"></a>
+<span class="sourceLineNo">399</span>   * be wholesome.  Rather than use the return direct, its usually best to<a name="line.399"></a>
+<span class="sourceLineNo">400</span>   * make a copy and use that.  Do<a name="line.400"></a>
+<span class="sourceLineNo">401</span>   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;<a name="line.401"></a>
+<span class="sourceLineNo">402</span>   * @return Instance of Configuration.<a name="line.402"></a>
+<span class="sourceLineNo">403</span>   */<a name="line.403"></a>
+<span class="sourceLineNo">404</span>  @Override<a name="line.404"></a>
+<span class="sourceLineNo">405</span>  public Configuration getConfiguration() {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    return super.getConfiguration();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>  }<a name="line.407"></a>
+<span class="sourceLineNo">408</span><a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public void setHBaseCluster(HBaseCluster hbaseCluster) {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    this.hbaseCluster = hbaseCluster;<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>   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}.<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   * Give it a random name so can have many concurrent tests running if<a name="line.415"></a>
+<span class="sourceLineNo">416</span>   * we need to.  It needs to amend the {@link #TEST_DIRECTORY_KEY}<a name="line.416"></a>
+<span class="sourceLineNo">417</span>   * System property, as it's what minidfscluster bases<a name="line.417"></a>
+<span class="sourceLineNo">418</span>   * it data dir on.  Moding a System property is not the way to do concurrent<a name="line.418"></a>
+<span class="sourceLineNo">419</span>   * instances -- another instance could grab the temporary<a name="line.419"></a>
+<span class="sourceLineNo">420</span>   * value unintentionally -- but not anything can do about it at moment;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * single instance only is how the minidfscluster works.<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   *<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * We also create the underlying directory for<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   *  hadoop.log.dir, mapreduce.cluster.local.dir and hadoop.tmp.dir, and set the values<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   *  in the conf, and as a system property for hadoop.tmp.dir<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   *<a name="line.426"></a>
+<span class="sourceLineNo">427</span>   * @return The calculated data test build directory, if newly-created.<a name="line.427"></a>
+<span class="sourceLineNo">428</span>   */<a name="line.428"></a>
+<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
+<span class="sourceLineNo">430</span>  protected Path setupDataTestDir() {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    Path testPath = super.setupDataTestDir();<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    if (null == testPath) {<a name="line.432"></a>
+<span class="sourceLineNo">433</span>      return null;<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>    createSubDirAndSystemProperty(<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      "hadoop.log.dir",<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      testPath, "hadoop-log-dir");<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    //  we want our own value to ensure uniqueness on the same machine<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    createSubDirAndSystemProperty(<a name="line.442"></a>
+<span class="sourceLineNo">443</span>      "hadoop.tmp.dir",<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      testPath, "hadoop-tmp-dir");<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    createSubDir(<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      "mapreduce.cluster.local.dir",<a name="line.448"></a>
+<span class="sourceLineNo">449</span>      testPath, "mapred-local-dir");<a name="line.449"></a>
+<span class="sourceLineNo">450</span><a name="line.450"></a>
+<span class="sourceLineNo">451</span>    return testPath;<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>  private void createSubDirAndSystemProperty(<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    String propertyName, Path parent, String subDirName){<a name="line.455"></a>
+<span class="sourceLineNo">456</span><a name="line.456"></a>
+<span class="sourceLineNo">457</span>    String sysValue = System.getProperty(propertyName);<a name="line.457"></a>
+<span class="sourceLineNo">458</span><a name="line.458"></a>
+<span class="sourceLineNo">459</span>    if (sysValue != null) {<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // There is already a value set. So we do nothing but hope<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      //  that there will be no conflicts<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      LOG.info("System.getProperty(\""+propertyName+"\") already set to: "+<a name="line.462"></a>
+<span class="sourceLineNo">463</span>        sysValue + " so I do NOT create it in " + parent);<a name="line.463"></a>
+<span class="sourceLineNo">464</span>      String confValue = conf.get(propertyName);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)){<a name="line.465"></a>
+<span class="sourceLineNo">466</span>       LOG.warn(<a name="line.466"></a>
+<span class="sourceLineNo">467</span>         propertyName + " property value differs in configuration and system: "+<a name="line.467"></a>
+<span class="sourceLineNo">468</span>         "Configuration="+confValue+" while System="+sysValue+<a name="line.468"></a>
+<span class="sourceLineNo">469</span>         " Erasing configuration value by system value."<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>      conf.set(propertyName, sysValue);<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    } else {<a name="line.473"></a>
+<span class="sourceLineNo">474</span>      // Ok, it's not set, so we create it as a subdirectory<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      createSubDir(propertyName, parent, subDirName);<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      System.setProperty(propertyName, conf.get(propertyName));<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    }<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>  /**<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * @return Where to write test data on the test filesystem; Returns working directory<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * for the test filesystem by default<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @see #setupDataTestDirOnTestFS()<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @see #getTestFileSystem()<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  private Path getBaseTestDirOnTestFS() throws IOException {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    FileSystem fs = getTestFileSystem();<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    return new Path(fs.getWorkingDirectory(), "test-data");<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>   * @return META table descriptor<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   * @deprecated since 2.0 version and will be removed in 3.0 version.<a name="line.493"></a>
+<span class="sourceLineNo">494</span>   *             use {@link #getMetaTableDescriptorBuilder()}<a name="line.494"></a>
+<span class="sourceLineNo">495</span>   */<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  @Deprecated<a name="line.496"></a>
+<span class="sourceLineNo">497</span>  public HTableDescriptor getMetaTableDescriptor() {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return new ImmutableHTableDescriptor(getMetaTableDescriptorBuilder().build());<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>   * @return META table descriptor<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   */<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public TableDescriptorBuilder getMetaTableDescriptorBuilder() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    try {<a name="line.505"></a>
+<span class="sourceLineNo">506</span>      return FSTableDescriptors.createMetaTableDescriptorBuilder(conf);<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    } catch (IOException e) {<a name="line.507"></a>
+<span class="sourceLineNo">508</span>      throw new RuntimeException("Unable to create META table descriptor", e);<a name="line.508"></a>
+<span class="sourceLineNo">509</span>    }<a name="line.509"></a>
+<span class="sourceLineNo">510</span>  }<a name="line.510"></a>
+<span class="sourceLineNo">511</span><a name="line.511"></a>
+<span class="sourceLineNo">512</span>  /**<a name="line.512"></a>
+<span class="sourceLineNo">513</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.513"></a>
+<span class="sourceLineNo">514</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * if the test relies on it.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @return a unique path in the test filesystem<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   */<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public Path getDataTestDirOnTestFS() throws IOException {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    if (dataTestDirOnTestFS == null) {<a name="line.519"></a>
+<span class="sourceLineNo">520</span>      setupDataTestDirOnTestFS();<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>    return dataTestDirOnTestFS;<a name="line.523"></a>
+<span class="sourceLineNo">524</span>  }<a name="line.524"></a>
+<span class="sourceLineNo">525</span><a name="line.525"></a>
+<span class="sourceLineNo">526</span>  /**<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()}<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * to write temporary test data. Call this method after setting up the mini dfs cluster<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * if the test relies on it.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   * @return a unique path in the test filesystem<a name="line.530"></a>
+<span class="sourceLineNo">531</span>   * @param subdirName name of the subdir to create under the base test dir<a name="line.531"></a>
+<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
+<span class="sourceLineNo">533</span>  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(getDataTestDirOnTestFS(), subdirName);<a name="line.534"></a>
+<span class="sourceLineNo">535</span>  }<a name="line.535"></a>
+<span class="sourceLineNo">536</span><a name="line.536

<TRUNCATED>

[17/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>            v -&gt;

<TRUNCATED>

[30/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.


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

Branch: refs/heads/asf-site
Commit: 6b8b907fec0d7d3943082677a873986a3fa27b8f
Parents: 39b82c8
Author: jenkins <bu...@apache.org>
Authored: Mon Oct 22 14:53:22 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Mon Oct 22 14:53:22 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    4 +-
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       |  574 +-
 coc.html                                        |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |    4 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |    4 +-
 devapidocs/constant-values.html                 |    4 +-
 devapidocs/index-all.html                       |    8 +-
 .../hadoop/hbase/backup/package-tree.html       |    4 +-
 .../hadoop/hbase/client/package-tree.html       |   24 +-
 .../hadoop/hbase/coprocessor/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 +-
 .../hbase/master/balancer/package-tree.html     |    2 +-
 .../hadoop/hbase/master/package-tree.html       |    4 +-
 .../hbase/master/procedure/package-tree.html    |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |   14 +-
 .../ProcedureExecutor.FailedProcedure.html      |   20 +-
 ...ProcedureExecutor.KeepAliveWorkerThread.html |    6 +-
 .../ProcedureExecutor.WorkerMonitor.html        |   32 +-
 .../ProcedureExecutor.WorkerThread.html         |   20 +-
 .../hbase/procedure2/ProcedureExecutor.html     |  132 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    4 +-
 .../store/ProcedureStore.ProcedureIterator.html |    8 +-
 .../store/wal/WALProcedureTree.Iter.html        |    8 +-
 .../hadoop/hbase/quotas/package-tree.html       |    6 +-
 .../regionserver/HStore.StoreFlusherImpl.html   |   34 +-
 .../hadoop/hbase/regionserver/HStore.html       |  407 +-
 .../regionserver/class-use/HStoreFile.html      |   12 +-
 .../hadoop/hbase/regionserver/package-tree.html |   16 +-
 .../regionserver/querymatcher/package-tree.html |    2 +-
 .../hbase/regionserver/wal/package-tree.html    |    2 +-
 .../replication/regionserver/package-tree.html  |    2 +-
 .../hadoop/hbase/rest/model/package-tree.html   |    2 +-
 .../hbase/security/access/package-tree.html     |    2 +-
 .../hadoop/hbase/security/package-tree.html     |    4 +-
 .../hadoop/hbase/thrift/package-tree.html       |    2 +-
 .../apache/hadoop/hbase/util/package-tree.html  |    8 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 .../org/apache/hadoop/hbase/Version.html        |    4 +-
 ...edureExecutor.CompletedProcedureCleaner.html | 3256 ++++---
 ...dureExecutor.CompletedProcedureRetainer.html | 3256 ++++---
 .../ProcedureExecutor.FailedProcedure.html      | 3256 ++++---
 ...ProcedureExecutor.KeepAliveWorkerThread.html | 3256 ++++---
 ...edureExecutor.ProcedureExecutorListener.html | 3256 ++++---
 .../procedure2/ProcedureExecutor.Testing.html   | 3256 ++++---
 .../ProcedureExecutor.WorkerMonitor.html        | 3256 ++++---
 .../ProcedureExecutor.WorkerThread.html         | 3256 ++++---
 .../hbase/procedure2/ProcedureExecutor.html     | 3256 ++++---
 .../store/ProcedureStore.ProcedureIterator.html |    4 +-
 .../store/ProcedureStore.ProcedureLoader.html   |    4 +-
 .../ProcedureStore.ProcedureStoreListener.html  |    4 +-
 .../hbase/procedure2/store/ProcedureStore.html  |    4 +-
 .../regionserver/HStore.StoreFlusherImpl.html   | 4901 ++++++-----
 .../hadoop/hbase/regionserver/HStore.html       | 4901 ++++++-----
 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 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |  469 +-
 .../hadoop/hbase/HBaseTestingUtility.html       | 8273 +++++++++---------
 testdevapidocs/index-all.html                   |    4 +
 ...lity.PortAllocator.AvailablePortChecker.html |    4 +-
 .../HBaseTestingUtility.PortAllocator.html      |   20 +-
 .../HBaseTestingUtility.SeenRowTracker.html     |   20 +-
 .../hadoop/hbase/HBaseTestingUtility.html       |  529 +-
 .../hadoop/hbase/backup/package-tree.html       |    2 +-
 .../apache/hadoop/hbase/client/TestAdmin2.html  |  131 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |    2 +-
 ...estingUtility.InjectAbortOnLoadListener.html |   16 +-
 .../MasterProcedureTestingUtility.html          |    4 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    8 +-
 .../hadoop/hbase/procedure2/package-tree.html   |    4 +-
 .../hadoop/hbase/regionserver/package-tree.html |    2 +-
 .../apache/hadoop/hbase/test/package-tree.html  |    4 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 ...lity.PortAllocator.AvailablePortChecker.html | 8273 +++++++++---------
 .../HBaseTestingUtility.PortAllocator.html      | 8273 +++++++++---------
 .../HBaseTestingUtility.SeenRowTracker.html     | 8273 +++++++++---------
 .../hadoop/hbase/HBaseTestingUtility.html       | 8273 +++++++++---------
 .../apache/hadoop/hbase/client/TestAdmin2.html  | 1419 +--
 ...estingUtility.InjectAbortOnLoadListener.html |  173 +-
 .../MasterProcedureTestingUtility.StepHook.html |  173 +-
 .../MasterProcedureTestingUtility.html          |  173 +-
 108 files changed, 42613 insertions(+), 42546 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index 112417e..0fb38fa 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -611,7 +611,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 17496df..84da4e4 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:20181021143222+00'00')
-/CreationDate (D:20181021144832+00'00')
+/ModDate (D:20181022143315+00'00')
+/CreationDate (D:20181022145007+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index 203afc7..8ccb15f 100644
--- a/book.html
+++ b/book.html
@@ -41324,7 +41324,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-21 14:32:22 UTC
+Last updated 2018-10-22 14:33:15 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index ba51e5e..d8c0811 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -316,7 +316,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index e21318d..c084b41 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -11368,1345 +11368,1345 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>388</td></tr>
+<td>387</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>390</td></tr>
+<td>389</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' child has incorrect indentation level 7, expected level should be 8.</td>
-<td>467</td></tr>
+<td>466</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>468</td></tr>
+<td>467</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>469</td></tr>
+<td>468</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>470</td></tr>
+<td>469</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 call rparen' has incorrect indentation level 7, expected level should be 8.</td>
-<td>471</td></tr>
+<td>470</td></tr>
 <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>483</td></tr>
+<td>482</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>565</td></tr>
+<td>564</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>569</td></tr>
+<td>568</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>577</td></tr>
+<td>576</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>581</td></tr>
+<td>580</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>589</td></tr>
+<td>588</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>599</td></tr>
+<td>598</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>614</td></tr>
+<td>613</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>618</td></tr>
+<td>617</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>619</td></tr>
+<td>618</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>620</td></tr>
+<td>619</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>632</td></tr>
+<td>631</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>636</td></tr>
+<td>635</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>637</td></tr>
+<td>636</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>653</td></tr>
+<td>652</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>653</td></tr>
+<td>652</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>760</td></tr>
+<td>759</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>798</td></tr>
+<td>797</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>1201</td></tr>
+<td>1200</td></tr>
 <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>1212</td></tr>
+<td>1211</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>1225</td></tr>
+<td>1224</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>1272</td></tr>
+<td>1271</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>1287</td></tr>
+<td>1286</td></tr>
 <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>1299</td></tr>
+<td>1298</td></tr>
 <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>1300</td></tr>
+<td>1299</td></tr>
 <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>1301</td></tr>
+<td>1300</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>1303</td></tr>
+<td>1302</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>1318</td></tr>
+<td>1317</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>1331</td></tr>
+<td>1330</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>1353</td></tr>
+<td>1352</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>1361</td></tr>
+<td>1360</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>1369</td></tr>
+<td>1368</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>1377</td></tr>
+<td>1376</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>1385</td></tr>
+<td>1384</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>1386</td></tr>
+<td>1385</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>1388</td></tr>
+<td>1387</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>1391</td></tr>
+<td>1390</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>1397</td></tr>
+<td>1396</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>1398</td></tr>
+<td>1397</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>1400</td></tr>
+<td>1399</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>1403</td></tr>
+<td>1402</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>1413</td></tr>
+<td>1412</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>1414</td></tr>
+<td>1413</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>1416</td></tr>
+<td>1415</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>1419</td></tr>
+<td>1418</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>1425</td></tr>
+<td>1424</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1426</td></tr>
+<td>1425</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>1427</td></tr>
+<td>1426</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>1429</td></tr>
+<td>1428</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>1433</td></tr>
+<td>1432</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>1443</td></tr>
+<td>1442</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>1444</td></tr>
+<td>1443</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>1446</td></tr>
+<td>1445</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>1449</td></tr>
+<td>1448</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>1455</td></tr>
+<td>1454</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>1456</td></tr>
+<td>1455</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>1458</td></tr>
+<td>1457</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>1466</td></tr>
+<td>1465</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>1467</td></tr>
+<td>1466</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>1468</td></tr>
+<td>1467</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>1470</td></tr>
+<td>1469</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>1494</td></tr>
+<td>1493</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>1506</td></tr>
+<td>1505</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>1507</td></tr>
+<td>1506</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>1510</td></tr>
+<td>1509</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>1513</td></tr>
+<td>1512</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>1567</td></tr>
+<td>1566</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>1586</td></tr>
+<td>1585</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>1597</td></tr>
+<td>1596</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>1598</td></tr>
+<td>1597</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>1599</td></tr>
+<td>1598</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>1601</td></tr>
+<td>1600</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>1604</td></tr>
+<td>1603</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>1610</td></tr>
+<td>1609</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>1611</td></tr>
+<td>1610</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>1612</td></tr>
+<td>1611</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>1614</td></tr>
+<td>1613</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>1623</td></tr>
+<td>1622</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>1624</td></tr>
+<td>1623</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>1625</td></tr>
+<td>1624</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>1626</td></tr>
+<td>1625</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>1628</td></tr>
+<td>1627</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>1646</td></tr>
+<td>1645</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>1647</td></tr>
+<td>1646</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>1648</td></tr>
+<td>1647</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>1650</td></tr>
+<td>1649</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>1659</td></tr>
+<td>1658</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>1660</td></tr>
+<td>1659</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>1661</td></tr>
+<td>1660</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>1662</td></tr>
+<td>1661</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>1664</td></tr>
+<td>1663</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 6, expected level should be 4.</td>
-<td>1684</td></tr>
+<td>1683</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' has incorrect indentation level 6, expected level should be 4.</td>
-<td>1685</td></tr>
+<td>1684</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1686</td></tr>
+<td>1685</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1689</td></tr>
+<td>1688</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>1690</td></tr>
+<td>1689</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 6, expected level should be 4.</td>
-<td>1691</td></tr>
+<td>1690</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' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1692</td></tr>
+<td>1691</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 6, expected level should be 4.</td>
-<td>1693</td></tr>
+<td>1692</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 6, expected level should be 4.</td>
-<td>1694</td></tr>
+<td>1693</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 6, expected level should be 4.</td>
-<td>1697</td></tr>
+<td>1696</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 6, expected level should be 4.</td>
-<td>1698</td></tr>
+<td>1697</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 4, expected level should be 2.</td>
-<td>1699</td></tr>
+<td>1698</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>1703</td></tr>
+<td>1702</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>1704</td></tr>
+<td>1703</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>1705</td></tr>
+<td>1704</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>1707</td></tr>
+<td>1706</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>1711</td></tr>
+<td>1710</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>1729</td></tr>
+<td>1728</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>1730</td></tr>
+<td>1729</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>1731</td></tr>
+<td>1730</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>1733</td></tr>
+<td>1732</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>1749</td></tr>
+<td>1748</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>1750</td></tr>
+<td>1749</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>1752</td></tr>
+<td>1751</td></tr>
 <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 one of the following: 8, 10.</td>
-<td>1766</td></tr>
+<td>1765</td></tr>
 <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 one of the following: 8, 10.</td>
-<td>1767</td></tr>
+<td>1766</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>1768</td></tr>
+<td>1767</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>1838</td></tr>
+<td>1837</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>1850</td></tr>
+<td>1849</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>1903</td></tr>
+<td>1902</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>1907</td></tr>
+<td>1906</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>1926</td></tr>
+<td>1925</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>1934</td></tr>
+<td>1933</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>1935</td></tr>
+<td>1934</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>1936</td></tr>
+<td>1935</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>1937</td></tr>
+<td>1936</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>1938</td></tr>
+<td>1937</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>1939</td></tr>
+<td>1938</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>1940</td></tr>
+<td>1939</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>1941</td></tr>
+<td>1940</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>1957</td></tr>
+<td>1956</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>1958</td></tr>
+<td>1957</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>1959</td></tr>
+<td>1958</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>1960</td></tr>
+<td>1959</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>1961</td></tr>
+<td>1960</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>1964</td></tr>
+<td>1963</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>2006</td></tr>
+<td>2005</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>2056</td></tr>
+<td>2055</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>2067</td></tr>
+<td>2066</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>2078</td></tr>
+<td>2077</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>2090</td></tr>
+<td>2089</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>2102</td></tr>
+<td>2101</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>2186</td></tr>
+<td>2185</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>2189</td></tr>
+<td>2188</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>2290</td></tr>
+<td>2289</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>2434</td></tr>
+<td>2433</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>2435</td></tr>
+<td>2434</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>2436</td></tr>
+<td>2435</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>2438</td></tr>
+<td>2437</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>2452</td></tr>
+<td>2451</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>2453</td></tr>
+<td>2452</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>2454</td></tr>
+<td>2453</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>2456</td></tr>
+<td>2455</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>2460</td></tr>
+<td>2459</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>2596</td></tr>
+<td>2595</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>2597</td></tr>
+<td>2596</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>2806</td></tr>
+<td>2805</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>2844</td></tr>
+<td>2843</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>2875</td></tr>
+<td>2874</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>2877</td></tr>
+<td>2876</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>2878</td></tr>
+<td>2877</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>2879</td></tr>
+<td>2878</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'while' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>2890</td></tr>
+<td>2889</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>2931</td></tr>
+<td>2930</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>2952</td></tr>
+<td>2951</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>3012</td></tr>
+<td>3011</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>3044</td></tr>
+<td>3043</td></tr>
 <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>3071</td></tr>
+<td>3070</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>3092</td></tr>
+<td>3091</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>3093</td></tr>
+<td>3092</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>3109</td></tr>
+<td>3108</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>3110</td></tr>
+<td>3109</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>3113</td></tr>
+<td>3112</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>3164</td></tr>
+<td>3163</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>3167</td></tr>
+<td>3166</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>3184</td></tr>
+<td>3183</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>3185</td></tr>
+<td>3184</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>3186</td></tr>
+<td>3185</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>3199</td></tr>
+<td>3198</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>3200</td></tr>
+<td>3199</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>3203</td></tr>
+<td>3202</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>3208</td></tr>
+<td>3207</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>3216</td></tr>
+<td>3215</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>3217</td></tr>
+<td>3216</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>3233</td></tr>
+<td>3232</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>3234</td></tr>
+<td>3233</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>3246</td></tr>
+<td>3245</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>3267</td></tr>
+<td>3266</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>3299</td></tr>
+<td>3298</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>3303</td></tr>
+<td>3302</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>3355</td></tr>
+<td>3354</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>3356</td></tr>
+<td>3355</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>3357</td></tr>
+<td>3356</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>3358</td></tr>
+<td>3357</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>3359</td></tr>
+<td>3358</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>3399</td></tr>
+<td>3398</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>3400</td></tr>
+<td>3399</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>3426</td></tr>
+<td>3425</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>3435</td></tr>
+<td>3434</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>3449</td></tr>
+<td>3448</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>3469</td></tr>
+<td>3468</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 104).</td>
-<td>3500</td></tr>
+<td>3499</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>3559</td></tr>
+<td>3558</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>3560</td></tr>
+<td>3559</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 rparen' has incorrect indentation level 48, expected level should be 2.</td>
-<td>3580</td></tr>
+<td>3579</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>3598</td></tr>
+<td>3597</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>3889</td></tr>
+<td>3888</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>3976</td></tr>
+<td>3975</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>3978</td></tr>
+<td>3977</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>4012</td></tr>
+<td>4011</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>4049</td></tr>
+<td>4048</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>4051</td></tr>
+<td>4050</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>4129</td></tr>
+<td>4128</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>4137</td></tr>
+<td>4136</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>4145</td></tr>
+<td>4144</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>4146</td></tr></table></div>
+<td>4145</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.HColumnDescriptor.java">org/apache/hadoop/hbase/HColumnDescriptor.java</h3>
 <table border="0" class="table table-striped">
@@ -28747,85 +28747,85 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>134</td></tr>
+<td>137</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>176</td></tr>
+<td>179</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>196</td></tr>
+<td>199</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>220</td></tr>
+<td>223</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>237</td></tr>
+<td>240</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>266</td></tr>
+<td>269</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>277</td></tr>
+<td>280</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>289</td></tr>
+<td>292</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>296</td></tr>
+<td>299</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'finally' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>298</td></tr>
+<td>301</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>304</td></tr>
+<td>307</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>422</td></tr>
+<td>425</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 1, expected level should be 2.</td>
-<td>444</td></tr>
+<td>447</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>528</td></tr></table></div>
+<td>531</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestAppendFromClientSide.java">org/apache/hadoop/hbase/client/TestAppendFromClientSide.java</h3>
 <table border="0" class="table table-striped">
@@ -71367,50 +71367,50 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
-<td>Method length is 154 lines (max allowed is 150).</td>
+<td>Method length is 152 lines (max allowed is 150).</td>
 <td>505</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>857</td></tr>
+<td>855</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>858</td></tr>
+<td>856</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>877</td></tr>
+<td>875</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>886</td></tr>
+<td>884</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>908</td></tr>
+<td>906</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>911</td></tr>
+<td>909</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>1453</td></tr></table></div>
+<td>1451</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">
@@ -77815,235 +77815,235 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>389</td></tr>
+<td>396</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>512</td></tr>
+<td>519</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>524</td></tr>
+<td>531</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>548</td></tr>
+<td>555</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 113).</td>
-<td>563</td></tr>
+<td>570</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>587</td></tr>
+<td>590</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>589</td></tr>
+<td>592</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>623</td></tr>
+<td>626</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>638</td></tr>
+<td>641</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>644</td></tr>
+<td>647</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>645</td></tr>
+<td>648</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>646</td></tr>
+<td>649</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 6, expected level should be 8.</td>
-<td>841</td></tr>
+<td>844</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>842</td></tr>
+<td>845</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 call' child has incorrect indentation level 9, expected level should be 10.</td>
-<td>843</td></tr>
+<td>846</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>846</td></tr>
+<td>849</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>854</td></tr>
+<td>857</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>966</td></tr>
+<td>969</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>972</td></tr>
+<td>975</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>1000</td></tr>
+<td>1003</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>1001</td></tr>
+<td>1004</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>1002</td></tr>
+<td>1005</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>1054</td></tr>
+<td>1057</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>1055</td></tr>
+<td>1058</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>1057</td></tr>
+<td>1060</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>1080</td></tr>
+<td>1083</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>1149</td></tr>
+<td>1152</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>1150</td></tr>
+<td>1153</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>1182</td></tr>
+<td>1185</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>1377</td></tr>
+<td>1380</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 101).</td>
-<td>1445</td></tr>
+<td>1448</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 114).</td>
-<td>1484</td></tr>
+<td>1487</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>1588</td></tr>
+<td>1591</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>1852</td></tr>
+<td>1845</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>2064</td></tr>
+<td>2057</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>2257</td></tr>
+<td>2250</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>2371</td></tr>
+<td>2364</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>2403</td></tr>
+<td>2396</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 102).</td>
-<td>2688</td></tr></table></div>
+<td>2681</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HStoreFile.java">org/apache/hadoop/hbase/regionserver/HStoreFile.java</h3>
 <table border="0" class="table table-striped">
@@ -117413,7 +117413,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 41794d0..cbe6bb9 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -385,7 +385,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 62beecd..60010d7 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -450,7 +450,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index f34d2b1..3a4e1db 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -889,7 +889,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index ae67e13..2376bdc 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.4-HBase.min.css" />
@@ -323,7 +323,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-10-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index f9a5baf..5d62f6c 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="20181021" />
+    <meta name="Date-Revision-yyyymmdd" content="20181022" />
     <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" />
@@ -1015,7 +1015,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-21</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-10-22</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index aa4bbf8..72b8c7f 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>"Sun Oct 21 14:43:28 UTC 2018"</code></td>
+<td class="colLast"><code>"Mon Oct 22 14:44:49 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>"f5f881f57d789d4aabea2eec95e064ba"</code></td>
+<td class="colLast"><code>"71b52165b80cc27916da6d7d4fb1ab20"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.url">


[14/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
index 5b9d987..b595018 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HStore.StoreFlusherImpl.html
@@ -310,2495 +310,2488 @@
 <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>    this.storeEngine = createStoreEngine(this, this.conf, this.comparator);<a name="line.304"></a>
-<span class="sourceLineNo">305</span>    this.storeEngine.getStoreFileManager().loadFiles(loadStoreFiles());<a name="line.305"></a>
-<span class="sourceLineNo">306</span><a name="line.306"></a>
-<span class="sourceLineNo">307</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    this.checksumType = getChecksumType(conf);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    // Initialize bytes per checksum<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    flushRetriesNumber = conf.getInt(<a name="line.311"></a>
-<span class="sourceLineNo">312</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.313"></a>
-<span class="sourceLineNo">314</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      throw new IllegalArgumentException(<a name="line.315"></a>
-<span class="sourceLineNo">316</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.316"></a>
-<span class="sourceLineNo">317</span>              + flushRetriesNumber);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    }<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    int confPrintThreshold =<a name="line.321"></a>
-<span class="sourceLineNo">322</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.322"></a>
-<span class="sourceLineNo">323</span>    if (confPrintThreshold &lt; 10) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      confPrintThreshold = 10;<a name="line.324"></a>
+<span class="sourceLineNo">305</span>    List&lt;HStoreFile&gt; hStoreFiles = loadStoreFiles();<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    // Move the storeSize calculation out of loadStoreFiles() method, because the secondary read<a name="line.306"></a>
+<span class="sourceLineNo">307</span>    // replica's refreshStoreFiles() will also use loadStoreFiles() to refresh its store files and<a name="line.307"></a>
+<span class="sourceLineNo">308</span>    // update the storeSize in the completeCompaction(..) finally (just like compaction) , so<a name="line.308"></a>
+<span class="sourceLineNo">309</span>    // no need calculate the storeSize twice.<a name="line.309"></a>
+<span class="sourceLineNo">310</span>    this.storeSize.addAndGet(getStorefilesSize(hStoreFiles, sf -&gt; true));<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    this.totalUncompressedBytes.addAndGet(getTotalUmcompressedBytes(hStoreFiles));<a name="line.311"></a>
+<span class="sourceLineNo">312</span>    this.storeEngine.getStoreFileManager().loadFiles(hStoreFiles);<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>    // Initialize checksum type from name. The names are CRC32, CRC32C, etc.<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    this.checksumType = getChecksumType(conf);<a name="line.315"></a>
+<span class="sourceLineNo">316</span>    // Initialize bytes per checksum<a name="line.316"></a>
+<span class="sourceLineNo">317</span>    this.bytesPerChecksum = getBytesPerChecksum(conf);<a name="line.317"></a>
+<span class="sourceLineNo">318</span>    flushRetriesNumber = conf.getInt(<a name="line.318"></a>
+<span class="sourceLineNo">319</span>        "hbase.hstore.flush.retries.number", DEFAULT_FLUSH_RETRIES_NUMBER);<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    pauseTime = conf.getInt(HConstants.HBASE_SERVER_PAUSE, HConstants.DEFAULT_HBASE_SERVER_PAUSE);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    if (flushRetriesNumber &lt;= 0) {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      throw new IllegalArgumentException(<a name="line.322"></a>
+<span class="sourceLineNo">323</span>          "hbase.hstore.flush.retries.number must be &gt; 0, not "<a name="line.323"></a>
+<span class="sourceLineNo">324</span>              + flushRetriesNumber);<a name="line.324"></a>
 <span class="sourceLineNo">325</span>    }<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.327"></a>
-<span class="sourceLineNo">328</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        family.getCompressionType());<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>   * @return MemStore Instance to use in this store.<a name="line.335"></a>
-<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
-<span class="sourceLineNo">337</span>  private MemStore getMemstore() {<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    MemStore ms = null;<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.339"></a>
-<span class="sourceLineNo">340</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (this.getTableName().isSystemTable()) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    } else {<a name="line.344"></a>
-<span class="sourceLineNo">345</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    }<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    if (inMemoryCompaction == null) {<a name="line.347"></a>
-<span class="sourceLineNo">348</span>      inMemoryCompaction =<a name="line.348"></a>
-<span class="sourceLineNo">349</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.349"></a>
-<span class="sourceLineNo">350</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    }<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    switch (inMemoryCompaction) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>      case NONE:<a name="line.353"></a>
-<span class="sourceLineNo">354</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            new Object[] { conf, this.comparator,<a name="line.355"></a>
-<span class="sourceLineNo">356</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.356"></a>
-<span class="sourceLineNo">357</span>        break;<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      default:<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.359"></a>
-<span class="sourceLineNo">360</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.361"></a>
-<span class="sourceLineNo">362</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    }<a name="line.363"></a>
-<span class="sourceLineNo">364</span>    return ms;<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>   * Creates the cache config.<a name="line.368"></a>
-<span class="sourceLineNo">369</span>   * @param family The current column family.<a name="line.369"></a>
-<span class="sourceLineNo">370</span>   */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>    this.cacheConf = new CacheConfig(conf, family);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>  }<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>   * Creates the store engine configured for the given Store.<a name="line.376"></a>
-<span class="sourceLineNo">377</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.377"></a>
-<span class="sourceLineNo">378</span>   *              being passed to coprocessors via the compactor.<a name="line.378"></a>
-<span class="sourceLineNo">379</span>   * @param conf Store configuration.<a name="line.379"></a>
-<span class="sourceLineNo">380</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.380"></a>
-<span class="sourceLineNo">381</span>   * @return StoreEngine to use.<a name="line.381"></a>
-<span class="sourceLineNo">382</span>   */<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.383"></a>
-<span class="sourceLineNo">384</span>      CellComparator kvComparator) throws IOException {<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    return StoreEngine.create(store, conf, comparator);<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>   * @param family<a name="line.389"></a>
-<span class="sourceLineNo">390</span>   * @return TTL in seconds of the specified family<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   */<a name="line.391"></a>
-<span class="sourceLineNo">392</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    long ttl = family.getTimeToLive();<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    if (ttl == HConstants.FOREVER) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>      // Default is unlimited ttl.<a name="line.396"></a>
-<span class="sourceLineNo">397</span>      ttl = Long.MAX_VALUE;<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    } else if (ttl == -1) {<a name="line.398"></a>
-<span class="sourceLineNo">399</span>      ttl = Long.MAX_VALUE;<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    } else {<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      // Second -&gt; ms adjust for user data<a name="line.401"></a>
-<span class="sourceLineNo">402</span>      ttl *= 1000;<a name="line.402"></a>
-<span class="sourceLineNo">403</span>    }<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    return ttl;<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>  @Override<a name="line.407"></a>
-<span class="sourceLineNo">408</span>  public String getColumnFamilyName() {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    return this.family.getNameAsString();<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  @Override<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  public TableName getTableName() {<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    return this.getRegionInfo().getTable();<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>  @Override<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public FileSystem getFileSystem() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return this.fs.getFileSystem();<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  }<a name="line.420"></a>
-<span class="sourceLineNo">421</span><a name="line.421"></a>
-<span class="sourceLineNo">422</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.422"></a>
-<span class="sourceLineNo">423</span>    return this.fs;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
-<span class="sourceLineNo">425</span><a name="line.425"></a>
-<span class="sourceLineNo">426</span>  /* Implementation of StoreConfigInformation */<a name="line.426"></a>
-<span class="sourceLineNo">427</span>  @Override<a name="line.427"></a>
-<span class="sourceLineNo">428</span>  public long getStoreFileTtl() {<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<a name="line.430"></a>
+<span class="sourceLineNo">326</span>    cryptoContext = EncryptionUtil.createEncryptionContext(conf, family);<a name="line.326"></a>
+<span class="sourceLineNo">327</span><a name="line.327"></a>
+<span class="sourceLineNo">328</span>    int confPrintThreshold =<a name="line.328"></a>
+<span class="sourceLineNo">329</span>        this.conf.getInt("hbase.region.store.parallel.put.print.threshold", 50);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    if (confPrintThreshold &lt; 10) {<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      confPrintThreshold = 10;<a name="line.331"></a>
+<span class="sourceLineNo">332</span>    }<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    this.parallelPutCountPrintThreshold = confPrintThreshold;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    LOG.info("Store={},  memstore type={}, storagePolicy={}, verifyBulkLoads={}, "<a name="line.334"></a>
+<span class="sourceLineNo">335</span>            + "parallelPutCountPrintThreshold={}, encoding={}, compression={}",<a name="line.335"></a>
+<span class="sourceLineNo">336</span>        getColumnFamilyName(), memstore.getClass().getSimpleName(), policyName, verifyBulkLoads,<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        parallelPutCountPrintThreshold, family.getDataBlockEncoding(),<a name="line.337"></a>
+<span class="sourceLineNo">338</span>        family.getCompressionType());<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>  /**<a name="line.341"></a>
+<span class="sourceLineNo">342</span>   * @return MemStore Instance to use in this store.<a name="line.342"></a>
+<span class="sourceLineNo">343</span>   */<a name="line.343"></a>
+<span class="sourceLineNo">344</span>  private MemStore getMemstore() {<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    MemStore ms = null;<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // Check if in-memory-compaction configured. Note MemoryCompactionPolicy is an enum!<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    MemoryCompactionPolicy inMemoryCompaction = null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    if (this.getTableName().isSystemTable()) {<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      inMemoryCompaction = MemoryCompactionPolicy.valueOf(<a name="line.349"></a>
+<span class="sourceLineNo">350</span>          conf.get("hbase.systemtables.compacting.memstore.type", "NONE"));<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    } else {<a name="line.351"></a>
+<span class="sourceLineNo">352</span>      inMemoryCompaction = family.getInMemoryCompaction();<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    }<a name="line.353"></a>
+<span class="sourceLineNo">354</span>    if (inMemoryCompaction == null) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      inMemoryCompaction =<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          MemoryCompactionPolicy.valueOf(conf.get(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_KEY,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>              CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT).toUpperCase());<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    }<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    switch (inMemoryCompaction) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      case NONE:<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        ms = ReflectionUtils.newInstance(DefaultMemStore.class,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>            new Object[] { conf, this.comparator,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>                this.getHRegion().getRegionServicesForStores()});<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        break;<a name="line.364"></a>
+<span class="sourceLineNo">365</span>      default:<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        Class&lt;? extends CompactingMemStore&gt; clz = conf.getClass(MEMSTORE_CLASS_NAME,<a name="line.366"></a>
+<span class="sourceLineNo">367</span>            CompactingMemStore.class, CompactingMemStore.class);<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        ms = ReflectionUtils.newInstance(clz, new Object[]{conf, this.comparator, this,<a name="line.368"></a>
+<span class="sourceLineNo">369</span>            this.getHRegion().getRegionServicesForStores(), inMemoryCompaction});<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    return ms;<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>  /**<a name="line.374"></a>
+<span class="sourceLineNo">375</span>   * Creates the cache config.<a name="line.375"></a>
+<span class="sourceLineNo">376</span>   * @param family The current column family.<a name="line.376"></a>
+<span class="sourceLineNo">377</span>   */<a name="line.377"></a>
+<span class="sourceLineNo">378</span>  protected void createCacheConf(final ColumnFamilyDescriptor family) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    this.cacheConf = new CacheConfig(conf, family);<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>   * Creates the store engine configured for the given Store.<a name="line.383"></a>
+<span class="sourceLineNo">384</span>   * @param store The store. An unfortunate dependency needed due to it<a name="line.384"></a>
+<span class="sourceLineNo">385</span>   *              being passed to coprocessors via the compactor.<a name="line.385"></a>
+<span class="sourceLineNo">386</span>   * @param conf Store configuration.<a name="line.386"></a>
+<span class="sourceLineNo">387</span>   * @param kvComparator KVComparator for storeFileManager.<a name="line.387"></a>
+<span class="sourceLineNo">388</span>   * @return StoreEngine to use.<a name="line.388"></a>
+<span class="sourceLineNo">389</span>   */<a name="line.389"></a>
+<span class="sourceLineNo">390</span>  protected StoreEngine&lt;?, ?, ?, ?&gt; createStoreEngine(HStore store, Configuration conf,<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      CellComparator kvComparator) throws IOException {<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    return StoreEngine.create(store, conf, comparator);<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>   * @param family<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * @return TTL in seconds of the specified family<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  public static long determineTTLFromFamily(final ColumnFamilyDescriptor family) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    // HCD.getTimeToLive returns ttl in seconds.  Convert to milliseconds.<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    long ttl = family.getTimeToLive();<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (ttl == HConstants.FOREVER) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      // Default is unlimited ttl.<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      ttl = Long.MAX_VALUE;<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    } else if (ttl == -1) {<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      ttl = Long.MAX_VALUE;<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    } else {<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      // Second -&gt; ms adjust for user data<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      ttl *= 1000;<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>    return ttl;<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>  @Override<a name="line.414"></a>
+<span class="sourceLineNo">415</span>  public String getColumnFamilyName() {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    return this.family.getNameAsString();<a name="line.416"></a>
+<span class="sourceLineNo">417</span>  }<a name="line.417"></a>
+<span class="sourceLineNo">418</span><a name="line.418"></a>
+<span class="sourceLineNo">419</span>  @Override<a name="line.419"></a>
+<span class="sourceLineNo">420</span>  public TableName getTableName() {<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    return this.getRegionInfo().getTable();<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>  @Override<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  public FileSystem getFileSystem() {<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    return this.fs.getFileSystem();<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  }<a name="line.427"></a>
+<span class="sourceLineNo">428</span><a name="line.428"></a>
+<span class="sourceLineNo">429</span>  public HRegionFileSystem getRegionFileSystem() {<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    return this.fs;<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>  @Override<a name="line.433"></a>
-<span class="sourceLineNo">434</span>  public long getMemStoreFlushSize() {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    return this.region.memstoreFlushSize;<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 MemStoreSize getFlushableSize() {<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    return this.memstore.getFlushableSize();<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 MemStoreSize getSnapshotSize() {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    return this.memstore.getSnapshotSize();<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>  @Override<a name="line.449"></a>
-<span class="sourceLineNo">450</span>  public long getCompactionCheckMultiplier() {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.454"></a>
-<span class="sourceLineNo">455</span>  public long getBlockingFileCount() {<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    return blockingFileCount;<a name="line.456"></a>
-<span class="sourceLineNo">457</span>  }<a name="line.457"></a>
-<span class="sourceLineNo">458</span>  /* End implementation of StoreConfigInformation */<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>   * Returns the configured bytesPerChecksum value.<a name="line.461"></a>
-<span class="sourceLineNo">462</span>   * @param conf The configuration<a name="line.462"></a>
-<span class="sourceLineNo">463</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.463"></a>
-<span class="sourceLineNo">464</span>   */<a name="line.464"></a>
-<span class="sourceLineNo">465</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.466"></a>
-<span class="sourceLineNo">467</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<a name="line.468"></a>
-<span class="sourceLineNo">469</span><a name="line.469"></a>
-<span class="sourceLineNo">470</span>  /**<a name="line.470"></a>
-<span class="sourceLineNo">471</span>   * Returns the configured checksum algorithm.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * @param conf The configuration<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * @return The checksum algorithm that is set in the configuration<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   */<a name="line.474"></a>
-<span class="sourceLineNo">475</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    if (checksumName == null) {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>      return ChecksumType.getDefaultChecksumType();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    } else {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>      return ChecksumType.nameToType(checksumName);<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><a name="line.483"></a>
-<span class="sourceLineNo">484</span>  /**<a name="line.484"></a>
-<span class="sourceLineNo">485</span>   * @return how many bytes to write between status checks<a name="line.485"></a>
-<span class="sourceLineNo">486</span>   */<a name="line.486"></a>
-<span class="sourceLineNo">487</span>  public static int getCloseCheckInterval() {<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    return closeCheckInterval;<a name="line.488"></a>
+<span class="sourceLineNo">433</span>  /* Implementation of StoreConfigInformation */<a name="line.433"></a>
+<span class="sourceLineNo">434</span>  @Override<a name="line.434"></a>
+<span class="sourceLineNo">435</span>  public long getStoreFileTtl() {<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    // TTL only applies if there's no MIN_VERSIONs setting on the column.<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return (this.scanInfo.getMinVersions() == 0) ? this.scanInfo.getTtl() : Long.MAX_VALUE;<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 long getMemStoreFlushSize() {<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    // TODO: Why is this in here?  The flushsize of the region rather than the store?  St.Ack<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    return this.region.memstoreFlushSize;<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  }<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public MemStoreSize getFlushableSize() {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    return this.memstore.getFlushableSize();<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>  @Override<a name="line.451"></a>
+<span class="sourceLineNo">452</span>  public MemStoreSize getSnapshotSize() {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    return this.memstore.getSnapshotSize();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  }<a name="line.454"></a>
+<span class="sourceLineNo">455</span><a name="line.455"></a>
+<span class="sourceLineNo">456</span>  @Override<a name="line.456"></a>
+<span class="sourceLineNo">457</span>  public long getCompactionCheckMultiplier() {<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    return this.compactionCheckMultiplier;<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>  @Override<a name="line.461"></a>
+<span class="sourceLineNo">462</span>  public long getBlockingFileCount() {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    return blockingFileCount;<a name="line.463"></a>
+<span class="sourceLineNo">464</span>  }<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  /* End implementation of StoreConfigInformation */<a name="line.465"></a>
+<span class="sourceLineNo">466</span><a name="line.466"></a>
+<span class="sourceLineNo">467</span>  /**<a name="line.467"></a>
+<span class="sourceLineNo">468</span>   * Returns the configured bytesPerChecksum value.<a name="line.468"></a>
+<span class="sourceLineNo">469</span>   * @param conf The configuration<a name="line.469"></a>
+<span class="sourceLineNo">470</span>   * @return The bytesPerChecksum that is set in the configuration<a name="line.470"></a>
+<span class="sourceLineNo">471</span>   */<a name="line.471"></a>
+<span class="sourceLineNo">472</span>  public static int getBytesPerChecksum(Configuration conf) {<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    return conf.getInt(HConstants.BYTES_PER_CHECKSUM,<a name="line.473"></a>
+<span class="sourceLineNo">474</span>                       HFile.DEFAULT_BYTES_PER_CHECKSUM);<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>  /**<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * Returns the configured checksum algorithm.<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * @param conf The configuration<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * @return The checksum algorithm that is set in the configuration<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
+<span class="sourceLineNo">482</span>  public static ChecksumType getChecksumType(Configuration conf) {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    String checksumName = conf.get(HConstants.CHECKSUM_TYPE_NAME);<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    if (checksumName == null) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      return ChecksumType.getDefaultChecksumType();<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    } else {<a name="line.486"></a>
+<span class="sourceLineNo">487</span>      return ChecksumType.nameToType(checksumName);<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    }<a name="line.488"></a>
 <span class="sourceLineNo">489</span>  }<a name="line.489"></a>
 <span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>  @Override<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    return this.family;<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 OptionalLong getMaxSequenceId() {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<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>  @Override<a name="line.501"></a>
-<span class="sourceLineNo">502</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.503"></a>
-<span class="sourceLineNo">504</span>  }<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.507"></a>
-<span class="sourceLineNo">508</span>   * @param hri {@link RegionInfo} for the region.<a name="line.508"></a>
-<span class="sourceLineNo">509</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.509"></a>
-<span class="sourceLineNo">510</span>   * @return Path to family/Store home directory.<a name="line.510"></a>
-<span class="sourceLineNo">511</span>   */<a name="line.511"></a>
-<span class="sourceLineNo">512</span>  @Deprecated<a name="line.512"></a>
-<span class="sourceLineNo">513</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.513"></a>
-<span class="sourceLineNo">514</span>      final RegionInfo hri, final byte[] family) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.519"></a>
-<span class="sourceLineNo">520</span>   * @param encodedName Encoded region name.<a name="line.520"></a>
-<span class="sourceLineNo">521</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.521"></a>
-<span class="sourceLineNo">522</span>   * @return Path to family/Store home directory.<a name="line.522"></a>
-<span class="sourceLineNo">523</span>   */<a name="line.523"></a>
-<span class="sourceLineNo">524</span>  @Deprecated<a name="line.524"></a>
-<span class="sourceLineNo">525</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.525"></a>
-<span class="sourceLineNo">526</span>      final String encodedName, final byte[] family) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.527"></a>
-<span class="sourceLineNo">528</span>  }<a name="line.528"></a>
-<span class="sourceLineNo">529</span><a name="line.529"></a>
-<span class="sourceLineNo">530</span>  /**<a name="line.530"></a>
-<span class="sourceLineNo">531</span>   * @return the data block encoder<a name="line.531"></a>
-<span class="sourceLineNo">532</span>   */<a name="line.532"></a>
-<span class="sourceLineNo">533</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return dataBlockEncoder;<a name="line.534"></a>
+<span class="sourceLineNo">491</span>  /**<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   * @return how many bytes to write between status checks<a name="line.492"></a>
+<span class="sourceLineNo">493</span>   */<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public static int getCloseCheckInterval() {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return closeCheckInterval;<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public ColumnFamilyDescriptor getColumnFamilyDescriptor() {<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return this.family;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public OptionalLong getMaxSequenceId() {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    return StoreUtils.getMaxSequenceIdInList(this.getStorefiles());<a name="line.505"></a>
+<span class="sourceLineNo">506</span>  }<a name="line.506"></a>
+<span class="sourceLineNo">507</span><a name="line.507"></a>
+<span class="sourceLineNo">508</span>  @Override<a name="line.508"></a>
+<span class="sourceLineNo">509</span>  public OptionalLong getMaxMemStoreTS() {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    return StoreUtils.getMaxMemStoreTSInList(this.getStorefiles());<a name="line.510"></a>
+<span class="sourceLineNo">511</span>  }<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>   * @param tabledir {@link Path} to where the table is being stored<a name="line.514"></a>
+<span class="sourceLineNo">515</span>   * @param hri {@link RegionInfo} for the region.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.516"></a>
+<span class="sourceLineNo">517</span>   * @return Path to family/Store home directory.<a name="line.517"></a>
+<span class="sourceLineNo">518</span>   */<a name="line.518"></a>
+<span class="sourceLineNo">519</span>  @Deprecated<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      final RegionInfo hri, final byte[] family) {<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    return getStoreHomedir(tabledir, hri.getEncodedName(), family);<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  }<a name="line.523"></a>
+<span class="sourceLineNo">524</span><a name="line.524"></a>
+<span class="sourceLineNo">525</span>  /**<a name="line.525"></a>
+<span class="sourceLineNo">526</span>   * @param tabledir {@link Path} to where the table is being stored<a name="line.526"></a>
+<span class="sourceLineNo">527</span>   * @param encodedName Encoded region name.<a name="line.527"></a>
+<span class="sourceLineNo">528</span>   * @param family {@link ColumnFamilyDescriptor} describing the column family<a name="line.528"></a>
+<span class="sourceLineNo">529</span>   * @return Path to family/Store home directory.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  @Deprecated<a name="line.531"></a>
+<span class="sourceLineNo">532</span>  public static Path getStoreHomedir(final Path tabledir,<a name="line.532"></a>
+<span class="sourceLineNo">533</span>      final String encodedName, final byte[] family) {<a name="line.533"></a>
+<span class="sourceLineNo">534</span>    return new Path(tabledir, new Path(encodedName, Bytes.toString(family)));<a name="line.534"></a>
 <span class="sourceLineNo">535</span>  }<a name="line.535"></a>
 <span class="sourceLineNo">536</span><a name="line.536"></a>
 <span class="sourceLineNo">537</span>  /**<a name="line.537"></a>
-<span class="sourceLineNo">538</span>   * Should be used only in tests.<a name="line.538"></a>
-<span class="sourceLineNo">539</span>   * @param blockEncoder the block delta encoder to use<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   */<a name="line.540"></a>
-<span class="sourceLineNo">541</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>    this.dataBlockEncoder = blockEncoder;<a name="line.542"></a>
-<span class="sourceLineNo">543</span>  }<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  /**<a name="line.545"></a>
-<span class="sourceLineNo">546</span>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.546"></a>
-<span class="sourceLineNo">547</span>   * from the given directory.<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * @throws IOException<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   */<a name="line.549"></a>
-<span class="sourceLineNo">550</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.550"></a>
-<span class="sourceLineNo">551</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    return openStoreFiles(files);<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>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      return Collections.emptyList();<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    }<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    // initialize the thread pool for opening store files in parallel..<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.561"></a>
-<span class="sourceLineNo">562</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.563"></a>
-<span class="sourceLineNo">564</span><a name="line.564"></a>
-<span class="sourceLineNo">565</span>    int totalValidStoreFile = 0;<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      // open each store file in parallel<a name="line.567"></a>
-<span class="sourceLineNo">568</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.568"></a>
-<span class="sourceLineNo">569</span>      totalValidStoreFile++;<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
+<span class="sourceLineNo">538</span>   * @return the data block encoder<a name="line.538"></a>
+<span class="sourceLineNo">539</span>   */<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  public HFileDataBlockEncoder getDataBlockEncoder() {<a name="line.540"></a>
+<span class="sourceLineNo">541</span>    return dataBlockEncoder;<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  }<a name="line.542"></a>
+<span class="sourceLineNo">543</span><a name="line.543"></a>
+<span class="sourceLineNo">544</span>  /**<a name="line.544"></a>
+<span class="sourceLineNo">545</span>   * Should be used only in tests.<a name="line.545"></a>
+<span class="sourceLineNo">546</span>   * @param blockEncoder the block delta encoder to use<a name="line.546"></a>
+<span class="sourceLineNo">547</span>   */<a name="line.547"></a>
+<span class="sourceLineNo">548</span>  void setDataBlockEncoderInTest(HFileDataBlockEncoder blockEncoder) {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>    this.dataBlockEncoder = blockEncoder;<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>   * Creates an unsorted list of StoreFile loaded in parallel<a name="line.553"></a>
+<span class="sourceLineNo">554</span>   * from the given directory.<a name="line.554"></a>
+<span class="sourceLineNo">555</span>   * @throws IOException<a name="line.555"></a>
+<span class="sourceLineNo">556</span>   */<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  private List&lt;HStoreFile&gt; loadStoreFiles() throws IOException {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>    Collection&lt;StoreFileInfo&gt; files = fs.getStoreFiles(getColumnFamilyName());<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    return openStoreFiles(files);<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>  private List&lt;HStoreFile&gt; openStoreFiles(Collection&lt;StoreFileInfo&gt; files) throws IOException {<a name="line.562"></a>
+<span class="sourceLineNo">563</span>    if (CollectionUtils.isEmpty(files)) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      return Collections.emptyList();<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    // initialize the thread pool for opening store files in parallel..<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    ThreadPoolExecutor storeFileOpenerThreadPool =<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      this.region.getStoreFileOpenAndCloseThreadPool("StoreFileOpenerThread-"<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        + this.region.getRegionInfo().getEncodedName() + "-" + this.getColumnFamilyName());<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    CompletionService&lt;HStoreFile&gt; completionService = new ExecutorCompletionService&lt;&gt;(storeFileOpenerThreadPool);<a name="line.570"></a>
 <span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    IOException ioe = null;<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    try {<a name="line.574"></a>
-<span class="sourceLineNo">575</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        try {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          HStoreFile storeFile = completionService.take().get();<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          if (storeFile != null) {<a name="line.578"></a>
-<span class="sourceLineNo">579</span>            long length = storeFile.getReader().length();<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            this.storeSize.addAndGet(length);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>            this.totalUncompressedBytes<a name="line.581"></a>
-<span class="sourceLineNo">582</span>                .addAndGet(storeFile.getReader().getTotalUncompressedBytes());<a name="line.582"></a>
-<span class="sourceLineNo">583</span>            LOG.debug("loaded {}", storeFile);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>            results.add(storeFile);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        } catch (InterruptedException e) {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        } catch (ExecutionException e) {<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.589"></a>
-<span class="sourceLineNo">590</span>        }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>      }<a name="line.591"></a>
-<span class="sourceLineNo">592</span>    } finally {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.593"></a>
-<span class="sourceLineNo">594</span>    }<a name="line.594"></a>
-<span class="sourceLineNo">595</span>    if (ioe != null) {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      // close StoreFile readers<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      boolean evictOnClose =<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      for (HStoreFile file : results) {<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        try {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>          if (file != null) {<a name="line.601"></a>
-<span class="sourceLineNo">602</span>            file.closeStoreFile(evictOnClose);<a name="line.602"></a>
-<span class="sourceLineNo">603</span>          }<a name="line.603"></a>
-<span class="sourceLineNo">604</span>        } catch (IOException e) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<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>    return results;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>  }<a name="line.612"></a>
+<span class="sourceLineNo">572</span>    int totalValidStoreFile = 0;<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    for (StoreFileInfo storeFileInfo : files) {<a name="line.573"></a>
+<span class="sourceLineNo">574</span>      // open each store file in parallel<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      completionService.submit(() -&gt; this.createStoreFileAndReader(storeFileInfo));<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      totalValidStoreFile++;<a name="line.576"></a>
+<span class="sourceLineNo">577</span>    }<a name="line.577"></a>
+<span class="sourceLineNo">578</span><a name="line.578"></a>
+<span class="sourceLineNo">579</span>    ArrayList&lt;HStoreFile&gt; results = new ArrayList&lt;&gt;(files.size());<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    IOException ioe = null;<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    try {<a name="line.581"></a>
+<span class="sourceLineNo">582</span>      for (int i = 0; i &lt; totalValidStoreFile; i++) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>        try {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          HStoreFile storeFile = completionService.take().get();<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          if (storeFile != null) {<a name="line.585"></a>
+<span class="sourceLineNo">586</span>            LOG.debug("loaded {}", storeFile);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>            results.add(storeFile);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          }<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        } catch (InterruptedException e) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          if (ioe == null) ioe = new InterruptedIOException(e.getMessage());<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        } catch (ExecutionException e) {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          if (ioe == null) ioe = new IOException(e.getCause());<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        }<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      }<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    } finally {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      storeFileOpenerThreadPool.shutdownNow();<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    }<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    if (ioe != null) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>      // close StoreFile readers<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      boolean evictOnClose =<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>      for (HStoreFile file : results) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>        try {<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          if (file != null) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>            file.closeStoreFile(evictOnClose);<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          }<a name="line.606"></a>
+<span class="sourceLineNo">607</span>        } catch (IOException e) {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>          LOG.warn("Could not close store file", e);<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>      throw ioe;<a name="line.611"></a>
+<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
 <span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>  @Override<a name="line.614"></a>
-<span class="sourceLineNo">615</span>  public void refreshStoreFiles() throws IOException {<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    refreshStoreFilesInternal(newFiles);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>  }<a name="line.618"></a>
-<span class="sourceLineNo">619</span><a name="line.619"></a>
-<span class="sourceLineNo">620</span>  /**<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * region replicas to keep up to date with the primary region files.<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * @throws IOException<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   */<a name="line.624"></a>
-<span class="sourceLineNo">625</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    for (String file : newFiles) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.628"></a>
-<span class="sourceLineNo">629</span>    }<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    refreshStoreFilesInternal(storeFiles);<a name="line.630"></a>
-<span class="sourceLineNo">631</span>  }<a name="line.631"></a>
-<span class="sourceLineNo">632</span><a name="line.632"></a>
-<span class="sourceLineNo">633</span>  /**<a name="line.633"></a>
-<span class="sourceLineNo">634</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.634"></a>
-<span class="sourceLineNo">635</span>   * been opened, and removes the store file readers for store files no longer<a name="line.635"></a>
-<span class="sourceLineNo">636</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.636"></a>
-<span class="sourceLineNo">637</span>   * the primary region files.<a name="line.637"></a>
-<span class="sourceLineNo">638</span>   * @throws IOException<a name="line.638"></a>
-<span class="sourceLineNo">639</span>   */<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    for (HStoreFile sf : currentFiles) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    }<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    for (HStoreFile sf : compactedFiles) {<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    }<a name="line.655"></a>
-<span class="sourceLineNo">656</span><a name="line.656"></a>
-<span class="sourceLineNo">657</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    // Exclude the files that have already been compacted<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.661"></a>
-<span class="sourceLineNo">662</span><a name="line.662"></a>
-<span class="sourceLineNo">663</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.663"></a>
-<span class="sourceLineNo">664</span>      return;<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>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.668"></a>
+<span class="sourceLineNo">614</span>    return results;<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>  @Override<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public void refreshStoreFiles() throws IOException {<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    Collection&lt;StoreFileInfo&gt; newFiles = fs.getStoreFiles(getColumnFamilyName());<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    refreshStoreFilesInternal(newFiles);<a name="line.620"></a>
+<span class="sourceLineNo">621</span>  }<a name="line.621"></a>
+<span class="sourceLineNo">622</span><a name="line.622"></a>
+<span class="sourceLineNo">623</span>  /**<a name="line.623"></a>
+<span class="sourceLineNo">624</span>   * Replaces the store files that the store has with the given files. Mainly used by secondary<a name="line.624"></a>
+<span class="sourceLineNo">625</span>   * region replicas to keep up to date with the primary region files.<a name="line.625"></a>
+<span class="sourceLineNo">626</span>   * @throws IOException<a name="line.626"></a>
+<span class="sourceLineNo">627</span>   */<a name="line.627"></a>
+<span class="sourceLineNo">628</span>  public void refreshStoreFiles(Collection&lt;String&gt; newFiles) throws IOException {<a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;StoreFileInfo&gt; storeFiles = new ArrayList&lt;&gt;(newFiles.size());<a name="line.629"></a>
+<span class="sourceLineNo">630</span>    for (String file : newFiles) {<a name="line.630"></a>
+<span class="sourceLineNo">631</span>      storeFiles.add(fs.getStoreFileInfo(getColumnFamilyName(), file));<a name="line.631"></a>
+<span class="sourceLineNo">632</span>    }<a name="line.632"></a>
+<span class="sourceLineNo">633</span>    refreshStoreFilesInternal(storeFiles);<a name="line.633"></a>
+<span class="sourceLineNo">634</span>  }<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>  /**<a name="line.636"></a>
+<span class="sourceLineNo">637</span>   * Checks the underlying store files, and opens the files that  have not<a name="line.637"></a>
+<span class="sourceLineNo">638</span>   * been opened, and removes the store file readers for store files no longer<a name="line.638"></a>
+<span class="sourceLineNo">639</span>   * available. Mainly used by secondary region replicas to keep up to date with<a name="line.639"></a>
+<span class="sourceLineNo">640</span>   * the primary region files.<a name="line.640"></a>
+<span class="sourceLineNo">641</span>   * @throws IOException<a name="line.641"></a>
+<span class="sourceLineNo">642</span>   */<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  private void refreshStoreFilesInternal(Collection&lt;StoreFileInfo&gt; newFiles) throws IOException {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    StoreFileManager sfm = storeEngine.getStoreFileManager();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    Collection&lt;HStoreFile&gt; currentFiles = sfm.getStorefiles();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    Collection&lt;HStoreFile&gt; compactedFiles = sfm.getCompactedfiles();<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    if (currentFiles == null) currentFiles = Collections.emptySet();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    if (newFiles == null) newFiles = Collections.emptySet();<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    if (compactedFiles == null) compactedFiles = Collections.emptySet();<a name="line.649"></a>
+<span class="sourceLineNo">650</span><a name="line.650"></a>
+<span class="sourceLineNo">651</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; currentFilesSet = new HashMap&lt;&gt;(currentFiles.size());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    for (HStoreFile sf : currentFiles) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      currentFilesSet.put(sf.getFileInfo(), sf);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>    }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>    HashMap&lt;StoreFileInfo, HStoreFile&gt; compactedFilesSet = new HashMap&lt;&gt;(compactedFiles.size());<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    for (HStoreFile sf : compactedFiles) {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      compactedFilesSet.put(sf.getFileInfo(), sf);<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Set&lt;StoreFileInfo&gt; newFilesSet = new HashSet&lt;StoreFileInfo&gt;(newFiles);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    // Exclude the files that have already been compacted<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    newFilesSet = Sets.difference(newFilesSet, compactedFilesSet.keySet());<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    Set&lt;StoreFileInfo&gt; toBeAddedFiles = Sets.difference(newFilesSet, currentFilesSet.keySet());<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    Set&lt;StoreFileInfo&gt; toBeRemovedFiles = Sets.difference(currentFilesSet.keySet(), newFilesSet);<a name="line.664"></a>
+<span class="sourceLineNo">665</span><a name="line.665"></a>
+<span class="sourceLineNo">666</span>    if (toBeAddedFiles.isEmpty() &amp;&amp; toBeRemovedFiles.isEmpty()) {<a name="line.666"></a>
+<span class="sourceLineNo">667</span>      return;<a name="line.667"></a>
+<span class="sourceLineNo">668</span>    }<a name="line.668"></a>
 <span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    }<a name="line.673"></a>
-<span class="sourceLineNo">674</span><a name="line.674"></a>
-<span class="sourceLineNo">675</span>    // try to open the files<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.676"></a>
+<span class="sourceLineNo">670</span>    LOG.info("Refreshing store files for region " + this.getRegionInfo().getRegionNameAsString()<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      + " files to add: " + toBeAddedFiles + " files to remove: " + toBeRemovedFiles);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    Set&lt;HStoreFile&gt; toBeRemovedStoreFiles = new HashSet&lt;&gt;(toBeRemovedFiles.size());<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    for (StoreFileInfo sfi : toBeRemovedFiles) {<a name="line.674"></a>
+<span class="sourceLineNo">675</span>      toBeRemovedStoreFiles.add(currentFilesSet.get(sfi));<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>    // propogate the file changes to the underlying store file manager<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.679"></a>
+<span class="sourceLineNo">678</span>    // try to open the files<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    List&lt;HStoreFile&gt; openedFiles = openStoreFiles(toBeAddedFiles);<a name="line.679"></a>
 <span class="sourceLineNo">680</span><a name="line.680"></a>
-<span class="sourceLineNo">681</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    // in-flight transactions might be made visible)<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>      // we must have the max sequence id here as we do have several store files<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<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>    completeCompaction(toBeRemovedStoreFiles);<a name="line.689"></a>
-<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
+<span class="sourceLineNo">681</span>    // propogate the file changes to the underlying store file manager<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    replaceStoreFiles(toBeRemovedStoreFiles, openedFiles); //won't throw an exception<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    // Advance the memstore read point to be at least the new store files seqIds so that<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    // readers might pick it up. This assumes that the store is not getting any writes (otherwise<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    // in-flight transactions might be made visible)<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    if (!toBeAddedFiles.isEmpty()) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      // we must have the max sequence id here as we do have several store files<a name="line.688"></a>
+<span class="sourceLineNo">689</span>      region.getMVCC().advanceTo(this.getMaxSequenceId().getAsLong());<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>  protected HStoreFile createStoreFileAndReader(final Path p) throws IOException {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    StoreFileInfo info = new StoreFileInfo(conf, this.getFileSystem(), p);<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return createStoreFileAndReader(info);<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  private HStoreFile createStoreFileAndReader(StoreFileInfo info) throws IOException {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    info.setRegionCoprocessorHost(this.region.getCoprocessorHost());<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    HStoreFile storeFile = new HStoreFile(this.getFileSystem(), info, this.conf, this.cacheConf,<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        this.family.getBloomFilterType(), isPrimaryReplicaStore());<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    storeFile.initReader();<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return storeFile;<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>  /**<a name="line.706"></a>
-<span class="sourceLineNo">707</span>   * This message intends to inform the MemStore that next coming updates<a name="line.707"></a>
-<span class="sourceLineNo">708</span>   * are going to be part of the replaying edits from WAL<a name="line.708"></a>
-<span class="sourceLineNo">709</span>   */<a name="line.709"></a>
-<span class="sourceLineNo">710</span>  public void startReplayingFromWAL(){<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    this.memstore.startReplayingFromWAL();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<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>   * This message intends to inform the MemStore that the replaying edits from WAL<a name="line.715"></a>
-<span class="sourceLineNo">716</span>   * are done<a name="line.716"></a>
-<span class="sourceLineNo">717</span>   */<a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public void stopReplayingFromWAL(){<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    this.memstore.stopReplayingFromWAL();<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  /**<a name="line.722"></a>
-<span class="sourceLineNo">723</span>   * Adds a value to the memstore<a name="line.723"></a>
-<span class="sourceLineNo">724</span>   */<a name="line.724"></a>
-<span class="sourceLineNo">725</span>  public void add(final Cell cell, MemStoreSizing memstoreSizing) {<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    lock.readLock().lock();<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    try {<a name="line.727"></a>
-<span class="sourceLineNo">728</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.729"></a>
-<span class="sourceLineNo">730</span>          "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      }<a name="line.731"></a>
-<span class="sourceLineNo">732</span>      this.memstore.add(cell, memstoreSizing);<a name="line.732"></a>
-<span class="sourceLineNo">733</span>    } finally {<a name="line.733"></a>
-<span class="sourceLineNo">734</span>      lock.readLock().unlock();<a name="line.734"></a>
-<span class="sourceLineNo">735</span>      currentParallelPutCount.decrementAndGet();<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    }<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>   * Adds the specified value to the memstore<a name="line.740"></a>
-<span class="sourceLineNo">741</span>   */<a name="line.741"></a>
-<span class="sourceLineNo">742</span>  public void add(final Iterable&lt;Cell&gt; cells, MemStoreSizing memstoreSizing) {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    lock.readLock().lock();<a name="line.743"></a>
-<span class="sourceLineNo">744</span>    try {<a name="line.744"></a>
-<span class="sourceLineNo">745</span>      if (this.currentParallelPutCount.getAndIncrement() &gt; this.parallelPutCountPrintThreshold) {<a name="line.745"></a>
-<span class="sourceLineNo">746</span>        LOG.trace(this.getTableName() + "tableName={}, encodedName={}, columnFamilyName={} is " +<a name="line.746"></a>
-<span class="sourceLineNo">747</span>            "too busy!", this.getRegionInfo().getEncodedName(), this .getColumnFamilyName());<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      }<a name="line.748"></a>
-<span class="sourceLineNo">749</span>      memstore.add(cells, memstoreSizing);<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    } finally {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>      lock.readLock().unlock();<a name="line.751"></a>
-<span class="sourceLineNo">752</span>      currentParallelPutCount.decrementAndGet();<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
-<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
-<span class="sourceLineNo">755</span><a name="line.755"></a>
-<span class="sourceLineNo">756</span>  @Override<a name="line.756"></a>
-<span class="sourceLineNo">757</span>  public long timeOfOldestEdit() {<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    return memstore.timeOfOldestEdit();<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  }<a name="line.759"></a>
-<span class="sourceLineNo">760</span><a name="line.760"></a>
-<span class="sourceLineNo">761</span>  /**<a name="line.761"></a>
-<span class="sourceLineNo">762</span>   * @return All store files.<a name="line.762"></a>
-<span class="sourceLineNo">763</span>   */<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  @Override<a name="line.764"></a>
-<span class="sourceLineNo">765</span>  public Collection&lt;HStoreFile&gt; getStorefiles() {<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    return this.storeEngine.getStoreFileManager().getStorefiles();<a name="line.766"></a>
-<span class="sourceLineNo">767</span>  }<a name="line.767"></a>
-<span class="sourceLineNo">768</span><a name="line.768"></a>
-<span class="sourceLineNo">769</span>  @Override<a name="line.769"></a>
-<span class="sourceLineNo">770</span>  public Collection&lt;HStoreFile&gt; getCompactedFiles() {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    return this.storeEngine.getStoreFileManager().getCompactedfiles();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>  }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span>  /**<a name="line.774"></a>
-<span class="sourceLineNo">775</span>   * This throws a WrongRegionException if the HFile does not fit in this region, or an<a name="line.775"></a>
-<span class="sourceLineNo">776</span>   * InvalidHFileException if the HFile is not valid.<a name="line.776"></a>
-<span class="sourceLineNo">777</span>   */<a name="line.777"></a>
-<span class="sourceLineNo">778</span>  public void assertBulkLoadHFileOk(Path srcPath) throws IOException {<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    HFile.Reader reader  = null;<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    try {<a name="line.780"></a>
-<span class="sourceLineNo">781</span>      LOG.info("Validating hfile at " + srcPath + " for inclusion in "<a name="line.781"></a>
-<span class="sourceLineNo">782</span>          + "store " + this + " region " + this.getRegionInfo().getRegionNameAsString());<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      reader = HFile.createReader(srcPath.getFileSystem(conf), srcPath, cacheConf,<a name="line.783"></a>
-<span class="sourceLineNo">784</span>        isPrimaryReplicaStore(), conf);<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      reader.loadFileInfo();<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>      Optional&lt;byte[]&gt; firstKey = reader.getFirstRowKey();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>      Preconditions.checkState(firstKey.isPresent(), "First key can not be null");<a name="line.788"></a>
-<span class="sourceLineNo">789</span>      Optional&lt;Cell&gt; lk = reader.getLastKey();<a name="line.789"></a>
-<span class="sourceLineNo">790</span>      Preconditions.checkState(lk.isPresent(), "Last key can not be null");<a name="line.790"></a>
-<span class="sourceLineNo">791</span>      byte[] lastKey =  CellUtil.cloneRow(lk.get());<a name="line.791"></a>
-<span class="sourceLineNo">792</span><a name="line.792"></a>
-<span class="sourceLineNo">793</span>      if (LOG.isDebugEnabled()) {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>        LOG.debug("HFile bounds: first=" + Bytes.toStringBinary(firstKey.get()) +<a name="line.794"></a>
-<span class="sourceLineNo">795</span>            " last=" + Bytes.toStringBinary(lastKey));<a name="line.795"></a>
-<span class="sourceLineNo">796</span>        LOG.debug("Region bounds: first=" +<a name="line.796"></a>
-<span class="sourceLineNo">797</span>            Bytes.toStringBinary(getRegionInfo().getStartKey()) +<a name="line.797"></a>
-<span class="sourceLineNo">798</span>            " last=" + Bytes.toStringBinary(getRegionInfo().getEndKey()));<a name="line.798"></a>
-<span class="sourceLineNo">799</span>      }<a name="line.799"></a>
-<span class="sourceLineNo">800</span><a name="line.800"></a>
-<span class="sourceLineNo">801</span>      if (!this.getRegionInfo().containsRange(firstKey.get(), lastKey)) {<a name="line.801"></a>
-<span class="sourceLineNo">802</span>        throw new WrongRegionException(<a name="line.802"></a>
-<span class="sourceLineNo">803</span>            "Bulk load file " + srcPath.toString() + " does not fit inside region "<a name="line.803"></a>
-<span class="sourceLineNo">804</span>            + this.getRegionInfo().getRegionNameAsString());<a name="line.804"></a>
-<span class="sourceLineNo">805</span>      }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>      if(reader.length() &gt; conf.getLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.807"></a>
-<span class="sourceLineNo">808</span>          HConstants.DEFAULT_MAX_FILE_SIZE)) {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>        LOG.warn("Trying to bulk load hfile " + srcPath + " with size: " +<a name="line.809"></a>
-<span class="sourceLineNo">810</span>            reader.length() + " bytes can be problematic as it may lead to oversplitting.");<a name="line.810"></a>
-<span class="sourceLineNo">811</span>      }<a name="line.811"></a>
-<span class="sourceLineNo">812</span><a name="line.812"></a>
-<span class="sourceLineNo">813</span>      if (verifyBulkLoads) {<a name="line.813"></a>
-<span class="sourceLineNo">814</span>        long verificationStartTime = EnvironmentEdgeManager.currentTime();<a name="line.814"></a>
-<span class="sourceLineNo">815</span>        LOG.info("Full verification started for bulk load hfile: {}", srcPath);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>        Cell prevCell = null;<a name="line.816"></a>
-<span class="sourceLineNo">817</span>        HFileScanner scanner = reader.getScanner(false, false, false);<a name="line.817"></a>
-<span class="sourceLineNo">818</span>        scanner.seekTo();<a name="line.818"></a>
-<span class="sourceLineNo">819</span>        do {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>          Cell cell = scanner.getCell();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>          if (prevCell != null) {<a name="line.821"></a>
-<span class="sourceLineNo">822</span>            if (comparator.compareRows(prevCell, cell) &gt; 0) {<a name="line.822"></a>
-<span class="sourceLineNo">823</span>              throw new InvalidHFileException("Previous row is greater than"<a name="line.823"></a>
-<span class="sourceLineNo">824</span>                  + " current row: path=" + srcPath + " previous="<a name="line.824"></a>
-<span class="sourceLineNo">825</span>                  + CellUtil.getCellKeyAsString(prevCell) + " current="<a name="line.825"></a>
-<span class="sourceLineNo">826</span>                  + CellUtil.getCellKeyAsString(cell));<a name="line.826"></a>
-<span class="sourceLineNo">827</span>            }<a name="line.827"></a>
-<span class="sourceLineNo">828</span>            if (CellComparator.getInstance().compareFam

<TRUNCATED>

[23/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line

<TRUNCATED>

[22/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>    

<TRUNCATED>

[16/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.html
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>            v -&gt; {<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span

<TRUNCATED>

[08/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
index 85db2da..a8efa41 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/HBaseTestingUtility.html
@@ -124,7 +124,7 @@ var activeTableTab = "activeTableTab";
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.178">HBaseTestingUtility</a>
+public class <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.177">HBaseTestingUtility</a>
 extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseZKTestingUtility</a></pre>
 <div class="block">Facility for testing HBase. Replacement for
  old HBaseTestCase and HBaseClusterTestCase functionality.
@@ -140,8 +140,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
  region-server-port are overridden such that a random port will be assigned (thus
  avoiding port contention if another local HBase instance is already running).
  <p>To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"
- setting it to true.
- Trigger pre commit.</div>
+ setting it to true.</div>
 </li>
 </ul>
 </div>
@@ -2019,7 +2018,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/HBaseZKTestingUtility.html"
 <li class="blockList">
 <h4>TEST_DIRECTORY_KEY</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-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/HBaseTestingUtility.html#line.187">TEST_DIRECTORY_KEY</a></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/HBaseTestingUtility.html#line.186">TEST_DIRECTORY_KEY</a></pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">can be used only with mini dfs</span></div>
 <div class="block">System property key to get test directory value. Name is as it is because mini dfs has
  hard-codings to put test data here. It should NOT be used directly in HBase, as it's a property
@@ -2036,7 +2035,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>REGIONS_PER_SERVER_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/HBaseTestingUtility.html#line.189">REGIONS_PER_SERVER_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/HBaseTestingUtility.html#line.188">REGIONS_PER_SERVER_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.REGIONS_PER_SERVER_KEY">Constant Field Values</a></dd>
@@ -2049,7 +2048,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_REGIONS_PER_SERVER</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.194">DEFAULT_REGIONS_PER_SERVER</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.193">DEFAULT_REGIONS_PER_SERVER</a></pre>
 <div class="block">The default number of regions per regionserver when creating a pre-split
  table.</div>
 <dl>
@@ -2064,7 +2063,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>PRESPLIT_TEST_TABLE_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/HBaseTestingUtility.html#line.197">PRESPLIT_TEST_TABLE_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/HBaseTestingUtility.html#line.196">PRESPLIT_TEST_TABLE_KEY</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PRESPLIT_TEST_TABLE_KEY">Constant Field Values</a></dd>
@@ -2077,7 +2076,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>PRESPLIT_TEST_TABLE</h4>
-<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.198">PRESPLIT_TEST_TABLE</a></pre>
+<pre>public static final&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.197">PRESPLIT_TEST_TABLE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.PRESPLIT_TEST_TABLE">Constant Field Values</a></dd>
@@ -2090,7 +2089,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>dfsCluster</h4>
-<pre>private&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.200">dfsCluster</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.199">dfsCluster</a></pre>
 </li>
 </ul>
 <a name="hbaseCluster">
@@ -2099,7 +2098,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>hbaseCluster</h4>
-<pre>private volatile&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/HBaseTestingUtility.html#line.202">hbaseCluster</a></pre>
+<pre>private volatile&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/HBaseTestingUtility.html#line.201">hbaseCluster</a></pre>
 </li>
 </ul>
 <a name="mrCluster">
@@ -2108,7 +2107,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>mrCluster</h4>
-<pre>private&nbsp;org.apache.hadoop.mapred.MiniMRCluster <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.203">mrCluster</a></pre>
+<pre>private&nbsp;org.apache.hadoop.mapred.MiniMRCluster <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.202">mrCluster</a></pre>
 </li>
 </ul>
 <a name="miniClusterRunning">
@@ -2117,7 +2116,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>miniClusterRunning</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.206">miniClusterRunning</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.205">miniClusterRunning</a></pre>
 <div class="block">If there is a mini cluster running for this testing utility instance.</div>
 </li>
 </ul>
@@ -2127,7 +2126,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>hadoopLogDir</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/HBaseTestingUtility.html#line.208">hadoopLogDir</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/HBaseTestingUtility.html#line.207">hadoopLogDir</a></pre>
 </li>
 </ul>
 <a name="dataTestDirOnTestFS">
@@ -2136,7 +2135,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>dataTestDirOnTestFS</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.212">dataTestDirOnTestFS</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.211">dataTestDirOnTestFS</a></pre>
 <div class="block">Directory on test filesystem where we put the data for this instance of
  HBaseTestingUtility</div>
 </li>
@@ -2147,7 +2146,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>connection</h4>
-<pre>private volatile&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.217">connection</a></pre>
+<pre>private volatile&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.216">connection</a></pre>
 <div class="block">Shared cluster connection.</div>
 </li>
 </ul>
@@ -2157,7 +2156,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>FS_URI</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.220">FS_URI</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.219">FS_URI</a></pre>
 <div class="block">Filesystem URI used for map-reduce mini-cluster setup</div>
 </li>
 </ul>
@@ -2167,7 +2166,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>MEMSTORETS_TAGS_PARAMETRIZED</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.223">MEMSTORETS_TAGS_PARAMETRIZED</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.222">MEMSTORETS_TAGS_PARAMETRIZED</a></pre>
 <div class="block">This is for unit tests parameterized with a single boolean.</div>
 </li>
 </ul>
@@ -2177,7 +2176,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>BLOOM_AND_COMPRESSION_COMBINATIONS</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.299">BLOOM_AND_COMPRESSION_COMBINATIONS</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html?is-external=true" title="class or interface in java.util">Collection</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.298">BLOOM_AND_COMPRESSION_COMBINATIONS</a></pre>
 </li>
 </ul>
 <a name="fam1">
@@ -2186,7 +2185,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>fam1</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1827">fam1</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1826">fam1</a></pre>
 </li>
 </ul>
 <a name="fam2">
@@ -2195,7 +2194,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>fam2</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1828">fam2</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1827">fam2</a></pre>
 </li>
 </ul>
 <a name="fam3">
@@ -2204,7 +2203,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>fam3</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1829">fam3</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1828">fam3</a></pre>
 </li>
 </ul>
 <a name="COLUMNS">
@@ -2213,7 +2212,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>COLUMNS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1830">COLUMNS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1829">COLUMNS</a></pre>
 </li>
 </ul>
 <a name="MAXVERSIONS">
@@ -2222,7 +2221,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>MAXVERSIONS</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1831">MAXVERSIONS</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1830">MAXVERSIONS</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.MAXVERSIONS">Constant Field Values</a></dd>
@@ -2235,7 +2234,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>FIRST_CHAR</h4>
-<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1833">FIRST_CHAR</a></pre>
+<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1832">FIRST_CHAR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.FIRST_CHAR">Constant Field Values</a></dd>
@@ -2248,7 +2247,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>LAST_CHAR</h4>
-<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1834">LAST_CHAR</a></pre>
+<pre>public static final&nbsp;char <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1833">LAST_CHAR</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.HBaseTestingUtility.LAST_CHAR">Constant Field Values</a></dd>
@@ -2261,7 +2260,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>START_KEY_BYTES</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1835">START_KEY_BYTES</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1834">START_KEY_BYTES</a></pre>
 </li>
 </ul>
 <a name="START_KEY">
@@ -2270,7 +2269,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>START_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/HBaseTestingUtility.html#line.1836">START_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/HBaseTestingUtility.html#line.1835">START_KEY</a></pre>
 </li>
 </ul>
 <a name="ROWS">
@@ -2279,7 +2278,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>ROWS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2391">ROWS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2390">ROWS</a></pre>
 <div class="block">All the row values for the data loaded by <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#loadTable-org.apache.hadoop.hbase.client.Table-byte:A-"><code>loadTable(Table, byte[])</code></a></div>
 </li>
 </ul>
@@ -2289,7 +2288,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>KEYS</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2406">KEYS</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2405">KEYS</a></pre>
 </li>
 </ul>
 <a name="KEYS_FOR_HBA_CREATE_TABLE">
@@ -2298,7 +2297,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>KEYS_FOR_HBA_CREATE_TABLE</h4>
-<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2418">KEYS_FOR_HBA_CREATE_TABLE</a></pre>
+<pre>public static final&nbsp;byte[][] <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2417">KEYS_FOR_HBA_CREATE_TABLE</a></pre>
 </li>
 </ul>
 <a name="hbaseAdmin">
@@ -2307,7 +2306,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>hbaseAdmin</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.HBaseAdmin <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2970">hbaseAdmin</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.HBaseAdmin <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.2969">hbaseAdmin</a></pre>
 </li>
 </ul>
 <a name="random">
@@ -2316,7 +2315,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>random</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3715">random</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3714">random</a></pre>
 </li>
 </ul>
 <a name="portAllocator">
@@ -2325,7 +2324,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockListLast">
 <li class="blockList">
 <h4>portAllocator</h4>
-<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility.PortAllocator</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3717">portAllocator</a></pre>
+<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.PortAllocator.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility.PortAllocator</a> <a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.3716">portAllocator</a></pre>
 </li>
 </ul>
 </li>
@@ -2342,7 +2341,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>HBaseTestingUtility</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.315">HBaseTestingUtility</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.314">HBaseTestingUtility</a>()</pre>
 <div class="block"><p>Create an HBaseTestingUtility using a default configuration.
 
  <p>Initially, all tmp files are written to a local test data directory.
@@ -2361,7 +2360,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HBaseTestingUtility</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.333">HBaseTestingUtility</a>(@Nullable
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.332">HBaseTestingUtility</a>(@Nullable
                            org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block"><p>Create an HBaseTestingUtility using a given configuration.
 
@@ -2393,7 +2392,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>available</h4>
-<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.231">available</a>(int&nbsp;port)</pre>
+<pre>public static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.230">available</a>(int&nbsp;port)</pre>
 <div class="block">Checks to see if a specific port is available.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -2409,7 +2408,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomAndCompressionCombinations</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.263">bloomAndCompressionCombinations</a>()</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.262">bloomAndCompressionCombinations</a>()</pre>
 <div class="block">Create all combinations of Bloom filters and compression algorithms for
  testing.</div>
 </li>
@@ -2420,7 +2419,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>memStoreTSAndTagsCombination</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.277">memStoreTSAndTagsCombination</a>()</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.276">memStoreTSAndTagsCombination</a>()</pre>
 <div class="block">Create combination of memstoreTS and tags</div>
 </li>
 </ul>
@@ -2430,7 +2429,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <ul class="blockList">
 <li class="blockList">
 <h4>memStoreTSTagsAndOffheapCombination</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.286">memStoreTSTagsAndOffheapCombination</a>()</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.285">memStoreTSTagsAndOffheapCombination</a>()</pre>
 </li>
 </ul>
 <a name="createLocalHTU--">
@@ -2440,7 +2439,7 @@ private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/jav
 <li class="blockList">
 <h4>createLocalHTU</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.364">createLocalHTU</a>()</pre>
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.363">createLocalHTU</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#HBaseTestingUtility--"><code>HBaseTestingUtility()</code></a> instead</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2455,7 +2454,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <li class="blockList">
 <h4>createLocalHTU</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.373">createLocalHTU</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
+public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.372">createLocalHTU</a>(org.apache.hadoop.conf.Configuration&nbsp;c)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#HBaseTestingUtility-org.apache.hadoop.conf.Configuration-"><code>HBaseTestingUtility(Configuration)</code></a> instead</span></div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -2469,7 +2468,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionAndWAL</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.380">closeRegionAndWAL</a>(org.apache.hadoop.hbase.regionserver.Region&nbsp;r)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.379">closeRegionAndWAL</a>(org.apache.hadoop.hbase.regionserver.Region&nbsp;r)
                               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">Close both the region <code>r</code> and it's underlying WAL. For use in tests.</div>
 <dl>
@@ -2484,7 +2483,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionAndWAL</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.387">closeRegionAndWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.386">closeRegionAndWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                               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">Close both the HRegion <code>r</code> and it's underlying WAL. For use in tests.</div>
 <dl>
@@ -2499,7 +2498,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>getConfiguration</h4>
-<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.406">getConfiguration</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.405">getConfiguration</a>()</pre>
 <div class="block">Returns this classes's instance of <code>Configuration</code>.  Be careful how
  you use the returned Configuration since <code>Connection</code> instances
  can be shared.  The Map of Connections is keyed by the Configuration.  If
@@ -2522,7 +2521,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>setHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.410">setHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;hbaseCluster)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.409">setHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/HBaseCluster.html" title="class in org.apache.hadoop.hbase">HBaseCluster</a>&nbsp;hbaseCluster)</pre>
 </li>
 </ul>
 <a name="setupDataTestDir--">
@@ -2531,7 +2530,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>setupDataTestDir</h4>
-<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.431">setupDataTestDir</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.430">setupDataTestDir</a>()</pre>
 <div class="block">Home our data in a dir under <a href="../../../../org/apache/hadoop/hbase/HBaseCommonTestingUtility.html#DEFAULT_BASE_TEST_DIRECTORY"><code>HBaseCommonTestingUtility.DEFAULT_BASE_TEST_DIRECTORY</code></a>.
  Give it a random name so can have many concurrent tests running if
  we need to.  It needs to amend the <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#TEST_DIRECTORY_KEY"><code>TEST_DIRECTORY_KEY</code></a>
@@ -2558,7 +2557,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>createSubDirAndSystemProperty</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.455">createSubDirAndSystemProperty</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;propertyName,
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.454">createSubDirAndSystemProperty</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;propertyName,
                                            org.apache.hadoop.fs.Path&nbsp;parent,
                                            <a href="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;subDirName)</pre>
 </li>
@@ -2569,7 +2568,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <ul class="blockList">
 <li class="blockList">
 <h4>getBaseTestDirOnTestFS</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.487">getBaseTestDirOnTestFS</a>()
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.486">getBaseTestDirOnTestFS</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="returnLabel">Returns:</span></dt>
@@ -2590,7 +2589,7 @@ public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtil
 <li class="blockList">
 <h4>getMetaTableDescriptor</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.498">getMetaTableDescriptor</a>()</pre>
+public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.497">getMetaTableDescriptor</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">since 2.0 version and will be removed in 3.0 version.
              use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getMetaTableDescriptorBuilder--"><code>getMetaTableDescriptorBuilder()</code></a></span></div>
 <dl>
@@ -2605,7 +2604,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>getMetaTableDescriptorBuilder</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.TableDescriptorBuilder&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.505">getMetaTableDescriptorBuilder</a>()</pre>
+<pre>public&nbsp;org.apache.hadoop.hbase.client.TableDescriptorBuilder&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.504">getMetaTableDescriptorBuilder</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>META table descriptor</dd>
@@ -2618,7 +2617,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataTestDirOnTestFS</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.519">getDataTestDirOnTestFS</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.518">getDataTestDirOnTestFS</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 a Path in the test filesystem, obtained from <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getTestFileSystem--"><code>getTestFileSystem()</code></a>
  to write temporary test data. Call this method after setting up the mini dfs cluster
@@ -2637,7 +2636,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>getDataTestDirOnTestFS</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.534">getDataTestDirOnTestFS</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;subdirName)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.533">getDataTestDirOnTestFS</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;subdirName)
                                                  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 a Path in the test filesystem, obtained from <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getTestFileSystem--"><code>getTestFileSystem()</code></a>
  to write temporary test data. Call this method after setting up the mini dfs cluster
@@ -2658,7 +2657,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>setupDataTestDirOnTestFS</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.542">setupDataTestDirOnTestFS</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.541">setupDataTestDirOnTestFS</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">Sets up a path in test filesystem to be used by tests.
  Creates a new directory if not already setup.</div>
@@ -2674,7 +2673,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>getNewDataTestDirOnTestFS</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.554">getNewDataTestDirOnTestFS</a>()
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.553">getNewDataTestDirOnTestFS</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">Sets up a new path in test filesystem to be used by tests.</div>
 <dl>
@@ -2689,7 +2688,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupDataTestDirOnTestFS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.579">cleanupDataTestDirOnTestFS</a>()
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.578">cleanupDataTestDirOnTestFS</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">Cleans the test data directory on the test filesystem.</div>
 <dl>
@@ -2706,7 +2705,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>cleanupDataTestDirOnTestFS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.591">cleanupDataTestDirOnTestFS</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;subdirName)
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.590">cleanupDataTestDirOnTestFS</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;subdirName)
                                    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">Cleans a subdirectory under the test data directory on the test filesystem.</div>
 <dl>
@@ -2723,7 +2722,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.603">startMiniDFSCluster</a>(int&nbsp;servers)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.602">startMiniDFSCluster</a>(int&nbsp;servers)
                                                           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>
 <div class="block">Start a minidfscluster.</div>
 <dl>
@@ -2744,7 +2743,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.618">startMiniDFSCluster</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;hosts)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.617">startMiniDFSCluster</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;hosts)
                                                           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>
 <div class="block">Start a minidfscluster.
  This is useful if you want to run datanode on distinct hosts for things
@@ -2769,7 +2768,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.636">startMiniDFSCluster</a>(int&nbsp;servers,
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.635">startMiniDFSCluster</a>(int&nbsp;servers,
                                                                  <a href="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;hosts)
                                                           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>
 <div class="block">Start a minidfscluster.
@@ -2793,7 +2792,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>setFs</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.641">setFs</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.640">setFs</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>
@@ -2807,7 +2806,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSCluster</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.653">startMiniDFSCluster</a>(int&nbsp;servers,
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.652">startMiniDFSCluster</a>(int&nbsp;servers,
                                                                  <a href="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;racks,
                                                                  <a href="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;hosts)
                                                           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>
@@ -2823,7 +2822,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniDFSClusterForTestWAL</h4>
-<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.684">startMiniDFSClusterForTestWAL</a>(int&nbsp;namenodePort)
+<pre>public&nbsp;org.apache.hadoop.hdfs.MiniDFSCluster&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.683">startMiniDFSClusterForTestWAL</a>(int&nbsp;namenodePort)
                                                                     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>
@@ -2837,7 +2836,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>createDirsAndSetProperties</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.692">createDirsAndSetProperties</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.691">createDirsAndSetProperties</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">This is used before starting HDFS and map-reduce mini-clusters</div>
 <dl>
@@ -2852,7 +2851,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>isReadShortCircuitOn</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.720">isReadShortCircuitOn</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.719">isReadShortCircuitOn</a>()</pre>
 <div class="block">Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property.
   This allows to specify this parameter on the command line.
    If not set, default is true.</div>
@@ -2864,7 +2863,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>enableShortCircuit</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.733">enableShortCircuit</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.732">enableShortCircuit</a>()</pre>
 <div class="block">Enable the short circuit read, unless configured differently.
  Set both HBase and HDFS settings, including skipping the hdfs checksum checks.</div>
 </li>
@@ -2875,7 +2874,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>createDirAndSetProperty</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.748">createDirAndSetProperty</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;relPath,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.747">createDirAndSetProperty</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;relPath,
                                        <a href="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;property)</pre>
 </li>
 </ul>
@@ -2885,7 +2884,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniDFSCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.762">shutdownMiniDFSCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.761">shutdownMiniDFSCluster</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">Shuts down instance created by call to <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniDFSCluster-int-"><code>startMiniDFSCluster(int)</code></a>
  or does nothing.</div>
@@ -2902,7 +2901,7 @@ public&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../s
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.781">startMiniCluster</a>(boolean&nbsp;createWALDir)
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.780">startMiniCluster</a>(boolean&nbsp;createWALDir)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
 <div class="block">Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.
@@ -2926,7 +2925,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.797">startMiniCluster</a>(int&nbsp;numSlaves,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.796">startMiniCluster</a>(int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
@@ -2952,7 +2951,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.815">startMiniCluster</a>(int&nbsp;numSlaves,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.814">startMiniCluster</a>(int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir,
                                                      boolean&nbsp;createWALDir)
                                               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>
@@ -2980,7 +2979,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.834">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.833">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      boolean&nbsp;createRootDir)
                                               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>
@@ -3008,7 +3007,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.852">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.851">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves)
                                               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>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Use <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#startMiniCluster-org.apache.hadoop.hbase.StartMiniClusterOption-"><code>startMiniCluster(StartMiniClusterOption)</code></a> instead.</span></div>
@@ -3034,7 +3033,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.871">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.870">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts,
                                                      boolean&nbsp;createRootDir)
@@ -3065,7 +3064,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.891">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.890">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts)
                                               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>
@@ -3094,7 +3093,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.910">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.909">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes)
                                               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>
@@ -3122,7 +3121,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.932">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.931">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numSlaves,
                                                      <a href="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;dataNodeHosts,
                                                      <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 org.apache.hadoop.hbase.master.HMaster&gt;&nbsp;masterClass,
@@ -3155,7 +3154,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.959">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.958">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes,
                                                      <a href="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;dataNodeHosts,
@@ -3190,7 +3189,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.988">startMiniCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.987">startMiniCluster</a>(int&nbsp;numMasters,
                                                      int&nbsp;numRegionServers,
                                                      int&nbsp;numDataNodes,
                                                      <a href="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;dataNodeHosts,
@@ -3228,7 +3227,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1008">startMiniCluster</a>(int&nbsp;numSlaves)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1007">startMiniCluster</a>(int&nbsp;numSlaves)
                                   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>
 <div class="block">Start up a minicluster of hbase, dfs and zookeeper clusters with given slave node number.
  All other options will use default values, defined in <a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.Builder.html" title="class in org.apache.hadoop.hbase"><code>StartMiniClusterOption.Builder</code></a>.</div>
@@ -3249,7 +3248,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1020">startMiniCluster</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1019">startMiniCluster</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>
 <div class="block">Start up a minicluster of hbase, dfs and zookeeper all using default options.
  Option default value can be found in <a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.Builder.html" title="class in org.apache.hadoop.hbase"><code>StartMiniClusterOption.Builder</code></a>.</div>
@@ -3268,7 +3267,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1030">startMiniCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1029">startMiniCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
                                   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>
 <div class="block">Start up a mini cluster of hbase, optionally dfs and zookeeper if needed.
  It modifies Configuration.  It homes the cluster data directory under a random
@@ -3287,7 +3286,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1068">startMiniHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1067">startMiniHBaseCluster</a>(<a href="../../../../org/apache/hadoop/hbase/StartMiniClusterOption.html" title="class in org.apache.hadoop.hbase">StartMiniClusterOption</a>&nbsp;option)
                                        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">Starts up mini hbase cluster.
@@ -3311,7 +3310,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1114">startMiniHBaseCluster</a>()
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1113">startMiniHBaseCluster</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>
 <div class="block">Starts up mini hbase cluster using default options.
@@ -3333,7 +3332,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1129">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1128">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers)
                                                    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>
@@ -3362,7 +3361,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1148">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1147">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers,
                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;rsPorts)
                                                    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>,
@@ -3393,7 +3392,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <li class="blockList">
 <h4>startMiniHBaseCluster</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1171">startMiniHBaseCluster</a>(int&nbsp;numMasters,
+public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1170">startMiniHBaseCluster</a>(int&nbsp;numMasters,
                                                           int&nbsp;numRegionServers,
                                                           <a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Integer.html?is-external=true" title="class or interface in java.lang">Integer</a>&gt;&nbsp;rsPorts,
                                                           <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 org.apache.hadoop.hbase.master.HMaster&gt;&nbsp;masterClass,
@@ -3431,7 +3430,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>restartHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1187">restartHBaseCluster</a>(int&nbsp;servers)
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1186">restartHBaseCluster</a>(int&nbsp;servers)
                          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">Starts the hbase cluster up again after shutting it down previously in a
@@ -3451,7 +3450,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getMiniHBaseCluster</h4>
-<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1215">getMiniHBaseCluster</a>()</pre>
+<pre>public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1214">getMiniHBaseCluster</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Current mini hbase cluster. Only has something in it after a call
@@ -3467,7 +3466,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1228">shutdownMiniCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1227">shutdownMiniCluster</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>
 <div class="block">Stops mini hbase, zk, and hdfs clusters.</div>
 <dl>
@@ -3485,7 +3484,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>shutdownMiniHBaseCluster</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1242">shutdownMiniHBaseCluster</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1241">shutdownMiniHBaseCluster</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 HBase mini cluster.  Does not shutdown zk or dfs if running.</div>
 <dl>
@@ -3500,7 +3499,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultRootDirPath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1274">getDefaultRootDirPath</a>(boolean&nbsp;create)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1273">getDefaultRootDirPath</a>(boolean&nbsp;create)
                                                 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 path to the default root dir the minicluster uses. If <code>create</code>
  is true, a new root directory path is fetched irrespective of whether it has been fetched
@@ -3520,7 +3519,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>getDefaultRootDirPath</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1289">getDefaultRootDirPath</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1288">getDefaultRootDirPath</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">Same as {<a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#getDefaultRootDirPath-boolean-"><code>getDefaultRootDirPath(boolean create)</code></a>
  except that <code>create</code> flag is false.
@@ -3539,7 +3538,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1305">createRootDir</a>(boolean&nbsp;create)
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1304">createRootDir</a>(boolean&nbsp;create)
                                         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">Creates an hbase rootdir in user home directory.  Also creates hbase
  version file.  Normally you won't make use of this method.  Root hbasedir
@@ -3564,7 +3563,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1320">createRootDir</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1319">createRootDir</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">Same as <a href="../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html#createRootDir-boolean-"><code>createRootDir(boolean create)</code></a>
  except that <code>create</code> flag is false.</div>
@@ -3582,7 +3581,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALRootDir</h4>
-<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1333">createWALRootDir</a>()
+<pre>public&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1332">createWALRootDir</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">Creates a hbase walDir in the user's home directory.
  Normally you won't make use of this method. Root hbaseWALDir
@@ -3602,7 +3601,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>setHBaseFsTmpDir</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1341">setHBaseFsTmpDir</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html#line.1340">setHBaseFsTmpDir</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>
@@ -3616,7 +3615,7 @@ public&nbsp;<a href="../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html"
 <ul class="blockList">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbas

<TRUNCATED>

[24/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/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 688bd4e..37bf508 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
@@ -589,1651 +589,1649 @@
 <span class="sourceLineNo">581</span>      LOG.debug("Loading {}", proc);<a name="line.581"></a>
 <span class="sourceLineNo">582</span><a name="line.582"></a>
 <span class="sourceLineNo">583</span>      Long rootProcId = getRootProcedureId(proc);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      if (rootProcId == null) {<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        // The 'proc' was ready to run but the root procedure was rolledback?<a name="line.585"></a>
-<span class="sourceLineNo">586</span>        scheduler.addBack(proc);<a name="line.586"></a>
-<span class="sourceLineNo">587</span>        continue;<a name="line.587"></a>
-<span class="sourceLineNo">588</span>      }<a name="line.588"></a>
-<span class="sourceLineNo">589</span><a name="line.589"></a>
-<span class="sourceLineNo">590</span>      if (proc.hasParent()) {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        // corrupted procedures are handled later at step 3<a name="line.592"></a>
-<span class="sourceLineNo">593</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          parent.incChildrenLatch();<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        }<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      }<a name="line.596"></a>
-<span class="sourceLineNo">597</span><a name="line.597"></a>
-<span class="sourceLineNo">598</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      procStack.loadStack(proc);<a name="line.599"></a>
-<span class="sourceLineNo">600</span><a name="line.600"></a>
-<span class="sourceLineNo">601</span>      proc.setRootProcId(rootProcId);<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      switch (proc.getState()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>        case RUNNABLE:<a name="line.603"></a>
-<span class="sourceLineNo">604</span>          runnableList.add(proc);<a name="line.604"></a>
-<span class="sourceLineNo">605</span>          break;<a name="line.605"></a>
-<span class="sourceLineNo">606</span>        case WAITING:<a name="line.606"></a>
-<span class="sourceLineNo">607</span>          waitingList.add(proc);<a name="line.607"></a>
-<span class="sourceLineNo">608</span>          break;<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        case WAITING_TIMEOUT:<a name="line.609"></a>
-<span class="sourceLineNo">610</span>          waitingTimeoutList.add(proc);<a name="line.610"></a>
-<span class="sourceLineNo">611</span>          break;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        case FAILED:<a name="line.612"></a>
-<span class="sourceLineNo">613</span>          failedList.add(proc);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>          break;<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        case ROLLEDBACK:<a name="line.615"></a>
-<span class="sourceLineNo">616</span>        case INITIALIZING:<a name="line.616"></a>
-<span class="sourceLineNo">617</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.617"></a>
-<span class="sourceLineNo">618</span>          LOG.error(msg);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>          throw new UnsupportedOperationException(msg);<a name="line.619"></a>
-<span class="sourceLineNo">620</span>        default:<a name="line.620"></a>
-<span class="sourceLineNo">621</span>          break;<a name="line.621"></a>
-<span class="sourceLineNo">622</span>      }<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    }<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // 4. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    waitingList.forEach(proc -&gt; {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      if (!proc.hasChildren()) {<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.628"></a>
-<span class="sourceLineNo">629</span>        // But, there is a case that, all the children are successful and before<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        // they can wake up their parent procedure, the master was killed.<a name="line.630"></a>
-<span class="sourceLineNo">631</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.631"></a>
-<span class="sourceLineNo">632</span>        // are not loaded because of their SUCCESS state.<a name="line.632"></a>
-<span class="sourceLineNo">633</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.633"></a>
-<span class="sourceLineNo">634</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.634"></a>
-<span class="sourceLineNo">635</span>        // will throw:<a name="line.635"></a>
-<span class="sourceLineNo">636</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.636"></a>
-<span class="sourceLineNo">637</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.637"></a>
-<span class="sourceLineNo">638</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.638"></a>
-<span class="sourceLineNo">639</span>        runnableList.add(proc);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      }<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    });<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    // 5. Push the procedures to the timeout executor<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      proc.afterReplay(getEnvironment());<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      timeoutExecutor.add(proc);<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    });<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    // 6. restore locks<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    restoreLocks();<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    // 7. Push the procedure to the scheduler<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    failedList.forEach(scheduler::addBack);<a name="line.651"></a>
-<span class="sourceLineNo">652</span>    runnableList.forEach(p -&gt; {<a name="line.652"></a>
-<span class="sourceLineNo">653</span>      p.afterReplay(getEnvironment());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      if (!p.hasParent()) {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.655"></a>
-<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      scheduler.addBack(p);<a name="line.657"></a>
-<span class="sourceLineNo">658</span>    });<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>  /**<a name="line.661"></a>
-<span class="sourceLineNo">662</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.662"></a>
-<span class="sourceLineNo">663</span>   * &lt;p/&gt;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.664"></a>
-<span class="sourceLineNo">665</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.665"></a>
-<span class="sourceLineNo">666</span>   * pending and in-progress procedures.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>   * @param numThreads number of threads available for procedure execution.<a name="line.667"></a>
-<span class="sourceLineNo">668</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.668"></a>
-<span class="sourceLineNo">669</span>   *          is found on replay. otherwise false.<a name="line.669"></a>
-<span class="sourceLineNo">670</span>   */<a name="line.670"></a>
-<span class="sourceLineNo">671</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.672"></a>
-<span class="sourceLineNo">673</span>    // procedures and triggering periodic procedures.<a name="line.673"></a>
-<span class="sourceLineNo">674</span>    this.corePoolSize = numThreads;<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    this.maxPoolSize = 10 * numThreads;<a name="line.675"></a>
-<span class="sourceLineNo">676</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.676"></a>
-<span class="sourceLineNo">677</span>        corePoolSize, maxPoolSize);<a name="line.677"></a>
-<span class="sourceLineNo">678</span><a name="line.678"></a>
-<span class="sourceLineNo">679</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>    // Create the workers<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    workerId.set(0);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.684"></a>
-<span class="sourceLineNo">685</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>      workerThreads.add(new WorkerThread(threadGroup));<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    }<a name="line.687"></a>
+<span class="sourceLineNo">584</span>      // The orphan procedures will be passed to handleCorrupted, so add an assert here<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assert rootProcId != null;<a name="line.585"></a>
+<span class="sourceLineNo">586</span><a name="line.586"></a>
+<span class="sourceLineNo">587</span>      if (proc.hasParent()) {<a name="line.587"></a>
+<span class="sourceLineNo">588</span>        Procedure&lt;TEnvironment&gt; parent = procedures.get(proc.getParentProcId());<a name="line.588"></a>
+<span class="sourceLineNo">589</span>        if (parent != null &amp;&amp; !proc.isFinished()) {<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          parent.incChildrenLatch();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>        }<a name="line.591"></a>
+<span class="sourceLineNo">592</span>      }<a name="line.592"></a>
+<span class="sourceLineNo">593</span><a name="line.593"></a>
+<span class="sourceLineNo">594</span>      RootProcedureState&lt;TEnvironment&gt; procStack = rollbackStack.get(rootProcId);<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      procStack.loadStack(proc);<a name="line.595"></a>
+<span class="sourceLineNo">596</span><a name="line.596"></a>
+<span class="sourceLineNo">597</span>      proc.setRootProcId(rootProcId);<a name="line.597"></a>
+<span class="sourceLineNo">598</span>      switch (proc.getState()) {<a name="line.598"></a>
+<span class="sourceLineNo">599</span>        case RUNNABLE:<a name="line.599"></a>
+<span class="sourceLineNo">600</span>          runnableList.add(proc);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>          break;<a name="line.601"></a>
+<span class="sourceLineNo">602</span>        case WAITING:<a name="line.602"></a>
+<span class="sourceLineNo">603</span>          waitingList.add(proc);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>          break;<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        case WAITING_TIMEOUT:<a name="line.605"></a>
+<span class="sourceLineNo">606</span>          waitingTimeoutList.add(proc);<a name="line.606"></a>
+<span class="sourceLineNo">607</span>          break;<a name="line.607"></a>
+<span class="sourceLineNo">608</span>        case FAILED:<a name="line.608"></a>
+<span class="sourceLineNo">609</span>          failedList.add(proc);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>          break;<a name="line.610"></a>
+<span class="sourceLineNo">611</span>        case ROLLEDBACK:<a name="line.611"></a>
+<span class="sourceLineNo">612</span>        case INITIALIZING:<a name="line.612"></a>
+<span class="sourceLineNo">613</span>          String msg = "Unexpected " + proc.getState() + " state for " + proc;<a name="line.613"></a>
+<span class="sourceLineNo">614</span>          LOG.error(msg);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>          throw new UnsupportedOperationException(msg);<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        default:<a name="line.616"></a>
+<span class="sourceLineNo">617</span>          break;<a name="line.617"></a>
+<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
+<span class="sourceLineNo">620</span><a name="line.620"></a>
+<span class="sourceLineNo">621</span>    // 3. Check the waiting procedures to see if some of them can be added to runnable.<a name="line.621"></a>
+<span class="sourceLineNo">622</span>    waitingList.forEach(proc -&gt; {<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      if (!proc.hasChildren()) {<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        // Normally, WAITING procedures should be waken by its children.<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        // But, there is a case that, all the children are successful and before<a name="line.625"></a>
+<span class="sourceLineNo">626</span>        // they can wake up their parent procedure, the master was killed.<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        // So, during recovering the procedures from ProcedureWal, its children<a name="line.627"></a>
+<span class="sourceLineNo">628</span>        // are not loaded because of their SUCCESS state.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>        // So we need to continue to run this WAITING procedure. But before<a name="line.629"></a>
+<span class="sourceLineNo">630</span>        // executing, we need to set its state to RUNNABLE, otherwise, a exception<a name="line.630"></a>
+<span class="sourceLineNo">631</span>        // will throw:<a name="line.631"></a>
+<span class="sourceLineNo">632</span>        // Preconditions.checkArgument(procedure.getState() == ProcedureState.RUNNABLE,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        // "NOT RUNNABLE! " + procedure.toString());<a name="line.633"></a>
+<span class="sourceLineNo">634</span>        proc.setState(ProcedureState.RUNNABLE);<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        runnableList.add(proc);<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      } else {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>        proc.afterReplay(getEnvironment());<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>    // 4. Push the procedures to the timeout executor<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    waitingTimeoutList.forEach(proc -&gt; {<a name="line.642"></a>
+<span class="sourceLineNo">643</span>      proc.afterReplay(getEnvironment());<a name="line.643"></a>
+<span class="sourceLineNo">644</span>      timeoutExecutor.add(proc);<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    });<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    // 5. restore locks<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    restoreLocks();<a name="line.647"></a>
+<span class="sourceLineNo">648</span>    // 6. Push the procedure to the scheduler<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    failedList.forEach(scheduler::addBack);<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    runnableList.forEach(p -&gt; {<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      p.afterReplay(getEnvironment());<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      if (!p.hasParent()) {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>        sendProcedureLoadedNotification(p.getProcId());<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      }<a name="line.654"></a>
+<span class="sourceLineNo">655</span>      scheduler.addBack(p);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>    });<a name="line.656"></a>
+<span class="sourceLineNo">657</span>  }<a name="line.657"></a>
+<span class="sourceLineNo">658</span><a name="line.658"></a>
+<span class="sourceLineNo">659</span>  /**<a name="line.659"></a>
+<span class="sourceLineNo">660</span>   * Initialize the procedure executor, but do not start workers. We will start them later.<a name="line.660"></a>
+<span class="sourceLineNo">661</span>   * &lt;p/&gt;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>   * It calls ProcedureStore.recoverLease() and ProcedureStore.load() to recover the lease, and<a name="line.662"></a>
+<span class="sourceLineNo">663</span>   * ensure a single executor, and start the procedure replay to resume and recover the previous<a name="line.663"></a>
+<span class="sourceLineNo">664</span>   * pending and in-progress procedures.<a name="line.664"></a>
+<span class="sourceLineNo">665</span>   * @param numThreads number of threads available for procedure execution.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>   * @param abortOnCorruption true if you want to abort your service in case a corrupted procedure<a name="line.666"></a>
+<span class="sourceLineNo">667</span>   *          is found on replay. otherwise false.<a name="line.667"></a>
+<span class="sourceLineNo">668</span>   */<a name="line.668"></a>
+<span class="sourceLineNo">669</span>  public void init(int numThreads, boolean abortOnCorruption) throws IOException {<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // We have numThreads executor + one timer thread used for timing out<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    // procedures and triggering periodic procedures.<a name="line.671"></a>
+<span class="sourceLineNo">672</span>    this.corePoolSize = numThreads;<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    this.maxPoolSize = 10 * numThreads;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    LOG.info("Starting {} core workers (bigger of cpus/4 or 16) with max (burst) worker count={}",<a name="line.674"></a>
+<span class="sourceLineNo">675</span>        corePoolSize, maxPoolSize);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    this.threadGroup = new ThreadGroup("PEWorkerGroup");<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    this.timeoutExecutor = new TimeoutExecutorThread&lt;&gt;(this, threadGroup);<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>    // Create the workers<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    workerId.set(0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    workerThreads = new CopyOnWriteArrayList&lt;&gt;();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    for (int i = 0; i &lt; corePoolSize; ++i) {<a name="line.683"></a>
+<span class="sourceLineNo">684</span>      workerThreads.add(new WorkerThread(threadGroup));<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>    long st, et;<a name="line.687"></a>
 <span class="sourceLineNo">688</span><a name="line.688"></a>
-<span class="sourceLineNo">689</span>    long st, et;<a name="line.689"></a>
-<span class="sourceLineNo">690</span><a name="line.690"></a>
-<span class="sourceLineNo">691</span>    // Acquire the store lease.<a name="line.691"></a>
-<span class="sourceLineNo">692</span>    st = System.nanoTime();<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    store.recoverLease();<a name="line.693"></a>
-<span class="sourceLineNo">694</span>    et = System.nanoTime();<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.695"></a>
-<span class="sourceLineNo">696</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>    // start the procedure scheduler<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    scheduler.start();<a name="line.699"></a>
-<span class="sourceLineNo">700</span><a name="line.700"></a>
-<span class="sourceLineNo">701</span>    // TODO: Split in two steps.<a name="line.701"></a>
-<span class="sourceLineNo">702</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    // The first one will make sure that we have the latest id,<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    // so we can start the threads and accept new procedures.<a name="line.704"></a>
-<span class="sourceLineNo">705</span>    // The second step will do the actual load of old procedures.<a name="line.705"></a>
-<span class="sourceLineNo">706</span>    st = System.nanoTime();<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    load(abortOnCorruption);<a name="line.707"></a>
-<span class="sourceLineNo">708</span>    et = System.nanoTime();<a name="line.708"></a>
-<span class="sourceLineNo">709</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.709"></a>
-<span class="sourceLineNo">710</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.710"></a>
-<span class="sourceLineNo">711</span>  }<a name="line.711"></a>
-<span class="sourceLineNo">712</span><a name="line.712"></a>
-<span class="sourceLineNo">713</span>  /**<a name="line.713"></a>
-<span class="sourceLineNo">714</span>   * Start the workers.<a name="line.714"></a>
-<span class="sourceLineNo">715</span>   */<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  public void startWorkers() throws IOException {<a name="line.716"></a>
-<span class="sourceLineNo">717</span>    if (!running.compareAndSet(false, true)) {<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      LOG.warn("Already running");<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      return;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>    }<a name="line.720"></a>
-<span class="sourceLineNo">721</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.721"></a>
-<span class="sourceLineNo">722</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    timeoutExecutor.start();<a name="line.723"></a>
-<span class="sourceLineNo">724</span>    for (WorkerThread worker: workerThreads) {<a name="line.724"></a>
-<span class="sourceLineNo">725</span>      worker.start();<a name="line.725"></a>
-<span class="sourceLineNo">726</span>    }<a name="line.726"></a>
-<span class="sourceLineNo">727</span><a name="line.727"></a>
-<span class="sourceLineNo">728</span>    // Internal chores<a name="line.728"></a>
-<span class="sourceLineNo">729</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.729"></a>
-<span class="sourceLineNo">730</span><a name="line.730"></a>
-<span class="sourceLineNo">731</span>    // Add completed cleaner chore<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<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>  public void stop() {<a name="line.735"></a>
-<span class="sourceLineNo">736</span>    if (!running.getAndSet(false)) {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>      return;<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>    LOG.info("Stopping");<a name="line.740"></a>
-<span class="sourceLineNo">741</span>    scheduler.stop();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>    timeoutExecutor.sendStopSignal();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>  }<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>  @VisibleForTesting<a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public void join() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    assert !isRunning() : "expected not running";<a name="line.747"></a>
-<span class="sourceLineNo">748</span><a name="line.748"></a>
-<span class="sourceLineNo">749</span>    // stop the timeout executor<a name="line.749"></a>
-<span class="sourceLineNo">750</span>    timeoutExecutor.awaitTermination();<a name="line.750"></a>
-<span class="sourceLineNo">751</span><a name="line.751"></a>
-<span class="sourceLineNo">752</span>    // stop the worker threads<a name="line.752"></a>
-<span class="sourceLineNo">753</span>    for (WorkerThread worker: workerThreads) {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>      worker.awaitTermination();<a name="line.754"></a>
-<span class="sourceLineNo">755</span>    }<a name="line.755"></a>
-<span class="sourceLineNo">756</span><a name="line.756"></a>
-<span class="sourceLineNo">757</span>    // Destroy the Thread Group for the executors<a name="line.757"></a>
-<span class="sourceLineNo">758</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.758"></a>
-<span class="sourceLineNo">759</span>    try {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>      threadGroup.destroy();<a name="line.760"></a>
-<span class="sourceLineNo">761</span>    } catch (IllegalThreadStateException e) {<a name="line.761"></a>
-<span class="sourceLineNo">762</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.762"></a>
-<span class="sourceLineNo">763</span>          this.threadGroup, e.getMessage());<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      // This dumps list of threads on STDOUT.<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      this.threadGroup.list();<a name="line.765"></a>
-<span class="sourceLineNo">766</span>    }<a name="line.766"></a>
-<span class="sourceLineNo">767</span><a name="line.767"></a>
-<span class="sourceLineNo">768</span>    // reset the in-memory state for testing<a name="line.768"></a>
-<span class="sourceLineNo">769</span>    completed.clear();<a name="line.769"></a>
-<span class="sourceLineNo">770</span>    rollbackStack.clear();<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    procedures.clear();<a name="line.771"></a>
-<span class="sourceLineNo">772</span>    nonceKeysToProcIdsMap.clear();<a name="line.772"></a>
-<span class="sourceLineNo">773</span>    scheduler.clear();<a name="line.773"></a>
-<span class="sourceLineNo">774</span>    lastProcId.set(-1);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
-<span class="sourceLineNo">776</span><a name="line.776"></a>
-<span class="sourceLineNo">777</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>    this.conf = conf;<a name="line.778"></a>
-<span class="sourceLineNo">779</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.779"></a>
-<span class="sourceLineNo">780</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
+<span class="sourceLineNo">689</span>    // Acquire the store lease.<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    st = System.nanoTime();<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    store.recoverLease();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    et = System.nanoTime();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    LOG.info("Recovered {} lease in {}", store.getClass().getSimpleName(),<a name="line.693"></a>
+<span class="sourceLineNo">694</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    // start the procedure scheduler<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    scheduler.start();<a name="line.697"></a>
+<span class="sourceLineNo">698</span><a name="line.698"></a>
+<span class="sourceLineNo">699</span>    // TODO: Split in two steps.<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    // TODO: Handle corrupted procedures (currently just a warn)<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    // The first one will make sure that we have the latest id,<a name="line.701"></a>
+<span class="sourceLineNo">702</span>    // so we can start the threads and accept new procedures.<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    // The second step will do the actual load of old procedures.<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    st = System.nanoTime();<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    load(abortOnCorruption);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>    et = System.nanoTime();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>    LOG.info("Loaded {} in {}", store.getClass().getSimpleName(),<a name="line.707"></a>
+<span class="sourceLineNo">708</span>      StringUtils.humanTimeDiff(TimeUnit.NANOSECONDS.toMillis(et - st)));<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>  /**<a name="line.711"></a>
+<span class="sourceLineNo">712</span>   * Start the workers.<a name="line.712"></a>
+<span class="sourceLineNo">713</span>   */<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  public void startWorkers() throws IOException {<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    if (!running.compareAndSet(false, true)) {<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      LOG.warn("Already running");<a name="line.716"></a>
+<span class="sourceLineNo">717</span>      return;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>    }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>    // Start the executors. Here we must have the lastProcId set.<a name="line.719"></a>
+<span class="sourceLineNo">720</span>    LOG.trace("Start workers {}", workerThreads.size());<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    timeoutExecutor.start();<a name="line.721"></a>
+<span class="sourceLineNo">722</span>    for (WorkerThread worker: workerThreads) {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      worker.start();<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>    // Internal chores<a name="line.726"></a>
+<span class="sourceLineNo">727</span>    timeoutExecutor.add(new WorkerMonitor());<a name="line.727"></a>
+<span class="sourceLineNo">728</span><a name="line.728"></a>
+<span class="sourceLineNo">729</span>    // Add completed cleaner chore<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    addChore(new CompletedProcedureCleaner&lt;&gt;(conf, store, completed, nonceKeysToProcIdsMap));<a name="line.730"></a>
+<span class="sourceLineNo">731</span>  }<a name="line.731"></a>
+<span class="sourceLineNo">732</span><a name="line.732"></a>
+<span class="sourceLineNo">733</span>  public void stop() {<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    if (!running.getAndSet(false)) {<a name="line.734"></a>
+<span class="sourceLineNo">735</span>      return;<a name="line.735"></a>
+<span class="sourceLineNo">736</span>    }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>    LOG.info("Stopping");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    scheduler.stop();<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    timeoutExecutor.sendStopSignal();<a name="line.740"></a>
+<span class="sourceLineNo">741</span>  }<a name="line.741"></a>
+<span class="sourceLineNo">742</span><a name="line.742"></a>
+<span class="sourceLineNo">743</span>  @VisibleForTesting<a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public void join() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    assert !isRunning() : "expected not running";<a name="line.745"></a>
+<span class="sourceLineNo">746</span><a name="line.746"></a>
+<span class="sourceLineNo">747</span>    // stop the timeout executor<a name="line.747"></a>
+<span class="sourceLineNo">748</span>    timeoutExecutor.awaitTermination();<a name="line.748"></a>
+<span class="sourceLineNo">749</span><a name="line.749"></a>
+<span class="sourceLineNo">750</span>    // stop the worker threads<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    for (WorkerThread worker: workerThreads) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>      worker.awaitTermination();<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    }<a name="line.753"></a>
+<span class="sourceLineNo">754</span><a name="line.754"></a>
+<span class="sourceLineNo">755</span>    // Destroy the Thread Group for the executors<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    // TODO: Fix. #join is not place to destroy resources.<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    try {<a name="line.757"></a>
+<span class="sourceLineNo">758</span>      threadGroup.destroy();<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    } catch (IllegalThreadStateException e) {<a name="line.759"></a>
+<span class="sourceLineNo">760</span>      LOG.error("ThreadGroup {} contains running threads; {}: See STDOUT",<a name="line.760"></a>
+<span class="sourceLineNo">761</span>          this.threadGroup, e.getMessage());<a name="line.761"></a>
+<span class="sourceLineNo">762</span>      // This dumps list of threads on STDOUT.<a name="line.762"></a>
+<span class="sourceLineNo">763</span>      this.threadGroup.list();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    }<a name="line.764"></a>
+<span class="sourceLineNo">765</span><a name="line.765"></a>
+<span class="sourceLineNo">766</span>    // reset the in-memory state for testing<a name="line.766"></a>
+<span class="sourceLineNo">767</span>    completed.clear();<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    rollbackStack.clear();<a name="line.768"></a>
+<span class="sourceLineNo">769</span>    procedures.clear();<a name="line.769"></a>
+<span class="sourceLineNo">770</span>    nonceKeysToProcIdsMap.clear();<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    scheduler.clear();<a name="line.771"></a>
+<span class="sourceLineNo">772</span>    lastProcId.set(-1);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>  }<a name="line.773"></a>
+<span class="sourceLineNo">774</span><a name="line.774"></a>
+<span class="sourceLineNo">775</span>  public void refreshConfiguration(final Configuration conf) {<a name="line.775"></a>
+<span class="sourceLineNo">776</span>    this.conf = conf;<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    setKeepAliveTime(conf.getLong(WORKER_KEEP_ALIVE_TIME_CONF_KEY,<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        DEFAULT_WORKER_KEEP_ALIVE_TIME), TimeUnit.MILLISECONDS);<a name="line.778"></a>
+<span class="sourceLineNo">779</span>  }<a name="line.779"></a>
+<span class="sourceLineNo">780</span><a name="line.780"></a>
+<span class="sourceLineNo">781</span>  // ==========================================================================<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  //  Accessors<a name="line.782"></a>
 <span class="sourceLineNo">783</span>  // ==========================================================================<a name="line.783"></a>
-<span class="sourceLineNo">784</span>  //  Accessors<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  // ==========================================================================<a name="line.785"></a>
-<span class="sourceLineNo">786</span>  public boolean isRunning() {<a name="line.786"></a>
-<span class="sourceLineNo">787</span>    return running.get();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>  }<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>   * @return the current number of worker threads.<a name="line.791"></a>
-<span class="sourceLineNo">792</span>   */<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  public int getWorkerThreadCount() {<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    return workerThreads.size();<a name="line.794"></a>
-<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
-<span class="sourceLineNo">796</span><a name="line.796"></a>
-<span class="sourceLineNo">797</span>  /**<a name="line.797"></a>
-<span class="sourceLineNo">798</span>   * @return the core pool size settings.<a name="line.798"></a>
-<span class="sourceLineNo">799</span>   */<a name="line.799"></a>
-<span class="sourceLineNo">800</span>  public int getCorePoolSize() {<a name="line.800"></a>
-<span class="sourceLineNo">801</span>    return corePoolSize;<a name="line.801"></a>
-<span class="sourceLineNo">802</span>  }<a name="line.802"></a>
-<span class="sourceLineNo">803</span><a name="line.803"></a>
-<span class="sourceLineNo">804</span>  public int getActiveExecutorCount() {<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    return activeExecutorCount.get();<a name="line.805"></a>
-<span class="sourceLineNo">806</span>  }<a name="line.806"></a>
-<span class="sourceLineNo">807</span><a name="line.807"></a>
-<span class="sourceLineNo">808</span>  public TEnvironment getEnvironment() {<a name="line.808"></a>
-<span class="sourceLineNo">809</span>    return this.environment;<a name="line.809"></a>
-<span class="sourceLineNo">810</span>  }<a name="line.810"></a>
-<span class="sourceLineNo">811</span><a name="line.811"></a>
-<span class="sourceLineNo">812</span>  public ProcedureStore getStore() {<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    return this.store;<a name="line.813"></a>
-<span class="sourceLineNo">814</span>  }<a name="line.814"></a>
-<span class="sourceLineNo">815</span><a name="line.815"></a>
-<span class="sourceLineNo">816</span>  ProcedureScheduler getScheduler() {<a name="line.816"></a>
-<span class="sourceLineNo">817</span>    return scheduler;<a name="line.817"></a>
-<span class="sourceLineNo">818</span>  }<a name="line.818"></a>
-<span class="sourceLineNo">819</span><a name="line.819"></a>
-<span class="sourceLineNo">820</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    this.scheduler.signalAll();<a name="line.822"></a>
-<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
-<span class="sourceLineNo">824</span><a name="line.824"></a>
-<span class="sourceLineNo">825</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.825"></a>
-<span class="sourceLineNo">826</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.826"></a>
-<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">784</span>  public boolean isRunning() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return running.get();<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>   * @return the current number of worker threads.<a name="line.789"></a>
+<span class="sourceLineNo">790</span>   */<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  public int getWorkerThreadCount() {<a name="line.791"></a>
+<span class="sourceLineNo">792</span>    return workerThreads.size();<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>  /**<a name="line.795"></a>
+<span class="sourceLineNo">796</span>   * @return the core pool size settings.<a name="line.796"></a>
+<span class="sourceLineNo">797</span>   */<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  public int getCorePoolSize() {<a name="line.798"></a>
+<span class="sourceLineNo">799</span>    return corePoolSize;<a name="line.799"></a>
+<span class="sourceLineNo">800</span>  }<a name="line.800"></a>
+<span class="sourceLineNo">801</span><a name="line.801"></a>
+<span class="sourceLineNo">802</span>  public int getActiveExecutorCount() {<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    return activeExecutorCount.get();<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>  public TEnvironment getEnvironment() {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    return this.environment;<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>  public ProcedureStore getStore() {<a name="line.810"></a>
+<span class="sourceLineNo">811</span>    return this.store;<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>  ProcedureScheduler getScheduler() {<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    return scheduler;<a name="line.815"></a>
+<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
+<span class="sourceLineNo">817</span><a name="line.817"></a>
+<span class="sourceLineNo">818</span>  public void setKeepAliveTime(final long keepAliveTime, final TimeUnit timeUnit) {<a name="line.818"></a>
+<span class="sourceLineNo">819</span>    this.keepAliveTime = timeUnit.toMillis(keepAliveTime);<a name="line.819"></a>
+<span class="sourceLineNo">820</span>    this.scheduler.signalAll();<a name="line.820"></a>
+<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
+<span class="sourceLineNo">822</span><a name="line.822"></a>
+<span class="sourceLineNo">823</span>  public long getKeepAliveTime(final TimeUnit timeUnit) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    return timeUnit.convert(keepAliveTime, TimeUnit.MILLISECONDS);<a name="line.824"></a>
+<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
+<span class="sourceLineNo">826</span><a name="line.826"></a>
+<span class="sourceLineNo">827</span>  // ==========================================================================<a name="line.827"></a>
+<span class="sourceLineNo">828</span>  //  Submit/Remove Chores<a name="line.828"></a>
 <span class="sourceLineNo">829</span>  // ==========================================================================<a name="line.829"></a>
-<span class="sourceLineNo">830</span>  //  Submit/Remove Chores<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>   * Add a chore procedure to the executor<a name="line.834"></a>
-<span class="sourceLineNo">835</span>   * @param chore the chore to add<a name="line.835"></a>
-<span class="sourceLineNo">836</span>   */<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.837"></a>
-<span class="sourceLineNo">838</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>    timeoutExecutor.add(chore);<a name="line.839"></a>
-<span class="sourceLineNo">840</span>  }<a name="line.840"></a>
-<span class="sourceLineNo">841</span><a name="line.841"></a>
-<span class="sourceLineNo">842</span>  /**<a name="line.842"></a>
-<span class="sourceLineNo">843</span>   * Remove a chore procedure from the executor<a name="line.843"></a>
-<span class="sourceLineNo">844</span>   * @param chore the chore to remove<a name="line.844"></a>
-<span class="sourceLineNo">845</span>   * @return whether the chore is removed, or it will be removed later<a name="line.845"></a>
-<span class="sourceLineNo">846</span>   */<a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.848"></a>
-<span class="sourceLineNo">849</span>    return timeoutExecutor.remove(chore);<a name="line.849"></a>
-<span class="sourceLineNo">850</span>  }<a name="line.850"></a>
-<span class="sourceLineNo">851</span><a name="line.851"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>  /**<a name="line.831"></a>
+<span class="sourceLineNo">832</span>   * Add a chore procedure to the executor<a name="line.832"></a>
+<span class="sourceLineNo">833</span>   * @param chore the chore to add<a name="line.833"></a>
+<span class="sourceLineNo">834</span>   */<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  public void addChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.835"></a>
+<span class="sourceLineNo">836</span>    chore.setState(ProcedureState.WAITING_TIMEOUT);<a name="line.836"></a>
+<span class="sourceLineNo">837</span>    timeoutExecutor.add(chore);<a name="line.837"></a>
+<span class="sourceLineNo">838</span>  }<a name="line.838"></a>
+<span class="sourceLineNo">839</span><a name="line.839"></a>
+<span class="sourceLineNo">840</span>  /**<a name="line.840"></a>
+<span class="sourceLineNo">841</span>   * Remove a chore procedure from the executor<a name="line.841"></a>
+<span class="sourceLineNo">842</span>   * @param chore the chore to remove<a name="line.842"></a>
+<span class="sourceLineNo">843</span>   * @return whether the chore is removed, or it will be removed later<a name="line.843"></a>
+<span class="sourceLineNo">844</span>   */<a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public boolean removeChore(ProcedureInMemoryChore&lt;TEnvironment&gt; chore) {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    chore.setState(ProcedureState.SUCCESS);<a name="line.846"></a>
+<span class="sourceLineNo">847</span>    return timeoutExecutor.remove(chore);<a name="line.847"></a>
+<span class="sourceLineNo">848</span>  }<a name="line.848"></a>
+<span class="sourceLineNo">849</span><a name="line.849"></a>
+<span class="sourceLineNo">850</span>  // ==========================================================================<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  //  Nonce Procedure helpers<a name="line.851"></a>
 <span class="sourceLineNo">852</span>  // ==========================================================================<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  //  Nonce Procedure helpers<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>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.856"></a>
-<span class="sourceLineNo">857</span>   * @param nonceGroup<a name="line.857"></a>
-<span class="sourceLineNo">858</span>   * @param nonce<a name="line.858"></a>
-<span class="sourceLineNo">859</span>   * @return the generated NonceKey<a name="line.859"></a>
-<span class="sourceLineNo">860</span>   */<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.861"></a>
-<span class="sourceLineNo">862</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<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>  /**<a name="line.865"></a>
-<span class="sourceLineNo">866</span>   * Register a nonce for a procedure that is going to be submitted.<a name="line.866"></a>
-<span class="sourceLineNo">867</span>   * A procId will be reserved and on submitProcedure(),<a name="line.867"></a>
-<span class="sourceLineNo">868</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.868"></a>
-<span class="sourceLineNo">869</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.869"></a>
-<span class="sourceLineNo">870</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.870"></a>
-<span class="sourceLineNo">871</span>   * and submit the procedure.<a name="line.871"></a>
-<span class="sourceLineNo">872</span>   *<a name="line.872"></a>
-<span class="sourceLineNo">873</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.873"></a>
-<span class="sourceLineNo">874</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.874"></a>
-<span class="sourceLineNo">875</span>   */<a name="line.875"></a>
-<span class="sourceLineNo">876</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.876"></a>
-<span class="sourceLineNo">877</span>    if (nonceKey == null) return -1;<a name="line.877"></a>
-<span class="sourceLineNo">878</span><a name="line.878"></a>
-<span class="sourceLineNo">879</span>    // check if we have already a Reserved ID for the nonce<a name="line.879"></a>
-<span class="sourceLineNo">880</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.880"></a>
-<span class="sourceLineNo">881</span>    if (oldProcId == null) {<a name="line.881"></a>
-<span class="sourceLineNo">882</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.882"></a>
-<span class="sourceLineNo">883</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.883"></a>
-<span class="sourceLineNo">884</span>      final long newProcId = nextProcId();<a name="line.884"></a>
-<span class="sourceLineNo">885</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.885"></a>
-<span class="sourceLineNo">886</span>      if (oldProcId == null) return -1;<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>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    while (isRunning() &amp;&amp;<a name="line.892"></a>
-<span class="sourceLineNo">893</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.893"></a>
-<span class="sourceLineNo">894</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      if (traceEnabled) {<a name="line.895"></a>
-<span class="sourceLineNo">896</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.896"></a>
-<span class="sourceLineNo">897</span>      }<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      Threads.sleep(100);<a name="line.898"></a>
-<span class="sourceLineNo">899</span>    }<a name="line.899"></a>
-<span class="sourceLineNo">900</span>    return oldProcId.longValue();<a name="line.900"></a>
-<span class="sourceLineNo">901</span>  }<a name="line.901"></a>
-<span class="sourceLineNo">902</span><a name="line.902"></a>
-<span class="sourceLineNo">903</span>  /**<a name="line.903"></a>
-<span class="sourceLineNo">904</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.904"></a>
-<span class="sourceLineNo">905</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.905"></a>
-<span class="sourceLineNo">906</span>   */<a name="line.906"></a>
-<span class="sourceLineNo">907</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.907"></a>
-<span class="sourceLineNo">908</span>    if (nonceKey == null) return;<a name="line.908"></a>
-<span class="sourceLineNo">909</span><a name="line.909"></a>
-<span class="sourceLineNo">910</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.910"></a>
-<span class="sourceLineNo">911</span>    if (procId == null) return;<a name="line.911"></a>
-<span class="sourceLineNo">912</span><a name="line.912"></a>
-<span class="sourceLineNo">913</span>    // if the procedure was not submitted, remove the nonce<a name="line.913"></a>
-<span class="sourceLineNo">914</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>    }<a name="line.916"></a>
-<span class="sourceLineNo">917</span>  }<a name="line.917"></a>
-<span class="sourceLineNo">918</span><a name="line.918"></a>
-<span class="sourceLineNo">919</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.919"></a>
-<span class="sourceLineNo">920</span>    private String procName;<a name="line.920"></a>
-<span class="sourceLineNo">921</span><a name="line.921"></a>
-<span class="sourceLineNo">922</span>    public FailedProcedure() {<a name="line.922"></a>
-<span class="sourceLineNo">923</span>    }<a name="line.923"></a>
-<span class="sourceLineNo">924</span><a name="line.924"></a>
-<span class="sourceLineNo">925</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.925"></a>
-<span class="sourceLineNo">926</span>        NonceKey nonceKey, IOException exception) {<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      this.procName = procName;<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      setProcId(procId);<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.929"></a>
-<span class="sourceLineNo">930</span>      setOwner(owner);<a name="line.930"></a>
-<span class="sourceLineNo">931</span>      setNonceKey(nonceKey);<a name="line.931"></a>
-<span class="sourceLineNo">932</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      setSubmittedTime(currentTime);<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      setLastUpdate(currentTime);<a name="line.934"></a>
-<span class="sourceLineNo">935</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<a name="line.935"></a>
-<span class="sourceLineNo">936</span>    }<a name="line.936"></a>
-<span class="sourceLineNo">937</span><a name="line.937"></a>
-<span class="sourceLineNo">938</span>    @Override<a name="line.938"></a>
-<span class="sourceLineNo">939</span>    public String getProcName() {<a name="line.939"></a>
-<span class="sourceLineNo">940</span>      return procName;<a name="line.940"></a>
-<span class="sourceLineNo">941</span>    }<a name="line.941"></a>
-<span class="sourceLineNo">942</span><a name="line.942"></a>
-<span class="sourceLineNo">943</span>    @Override<a name="line.943"></a>
-<span class="sourceLineNo">944</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.944"></a>
-<span class="sourceLineNo">945</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.945"></a>
-<span class="sourceLineNo">946</span>        InterruptedException {<a name="line.946"></a>
-<span class="sourceLineNo">947</span>      throw new UnsupportedOperationException();<a name="line.947"></a>
-<span class="sourceLineNo">948</span>    }<a name="line.948"></a>
-<span class="sourceLineNo">949</span><a name="line.949"></a>
-<span class="sourceLineNo">950</span>    @Override<a name="line.950"></a>
-<span class="sourceLineNo">951</span>    protected void rollback(TEnvironment env)<a name="line.951"></a>
-<span class="sourceLineNo">952</span>        throws IOException, InterruptedException {<a name="line.952"></a>
-<span class="sourceLineNo">953</span>      throw new UnsupportedOperationException();<a name="line.953"></a>
-<span class="sourceLineNo">954</span>    }<a name="line.954"></a>
-<span class="sourceLineNo">955</span><a name="line.955"></a>
-<span class="sourceLineNo">956</span>    @Override<a name="line.956"></a>
-<span class="sourceLineNo">957</span>    protected boolean abort(TEnvironment env) {<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      throw new UnsupportedOperationException();<a name="line.958"></a>
-<span class="sourceLineNo">959</span>    }<a name="line.959"></a>
-<span class="sourceLineNo">960</span><a name="line.960"></a>
-<span class="sourceLineNo">961</span>    @Override<a name="line.961"></a>
-<span class="sourceLineNo">962</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.962"></a>
-<span class="sourceLineNo">963</span>        throws IOException {<a name="line.963"></a>
-<span class="sourceLineNo">964</span>    }<a name="line.964"></a>
-<span class="sourceLineNo">965</span><a name="line.965"></a>
-<span class="sourceLineNo">966</span>    @Override<a name="line.966"></a>
-<span class="sourceLineNo">967</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.967"></a>
-<span class="sourceLineNo">968</span>        throws IOException {<a name="line.968"></a>
-<span class="sourceLineNo">969</span>    }<a name="line.969"></a>
-<span class="sourceLineNo">970</span>  }<a name="line.970"></a>
-<span class="sourceLineNo">971</span><a name="line.971"></a>
-<span class="sourceLineNo">972</span>  /**<a name="line.972"></a>
-<span class="sourceLineNo">973</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.973"></a>
-<span class="sourceLineNo">974</span>   * same error to the requests with the same nonceKey.<a name="line.974"></a>
-<span class="sourceLineNo">975</span>   *<a name="line.975"></a>
-<span class="sourceLineNo">976</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.976"></a>
-<span class="sourceLineNo">977</span>   * @param procName name of the procedure, used to inform the user<a name="line.977"></a>
-<span class="sourceLineNo">978</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.978"></a>
-<span class="sourceLineNo">979</span>   * @param exception the failure to report to the user<a name="line.979"></a>
-<span class="sourceLineNo">980</span>   */<a name="line.980"></a>
-<span class="sourceLineNo">981</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.981"></a>
-<span class="sourceLineNo">982</span>      IOException exception) {<a name="line.982"></a>
-<span class="sourceLineNo">983</span>    if (nonceKey == null) {<a name="line.983"></a>
-<span class="sourceLineNo">984</span>      return;<a name="line.984"></a>
-<span class="sourceLineNo">985</span>    }<a name="line.985"></a>
-<span class="sourceLineNo">986</span><a name="line.986"></a>
-<span class="sourceLineNo">987</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.987"></a>
-<span class="sourceLineNo">988</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      return;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>    }<a name="line.990"></a>
-<span class="sourceLineNo">991</span><a name="line.991"></a>
-<span class="sourceLineNo">992</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.992"></a>
-<span class="sourceLineNo">993</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  }<a name="line.996"></a>
-<span class="sourceLineNo">997</span><a name="line.997"></a>
+<span class="sourceLineNo">853</span>  /**<a name="line.853"></a>
+<span class="sourceLineNo">854</span>   * Create a NoneKey from the specified nonceGroup and nonce.<a name="line.854"></a>
+<span class="sourceLineNo">855</span>   * @param nonceGroup<a name="line.855"></a>
+<span class="sourceLineNo">856</span>   * @param nonce<a name="line.856"></a>
+<span class="sourceLineNo">857</span>   * @return the generated NonceKey<a name="line.857"></a>
+<span class="sourceLineNo">858</span>   */<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  public NonceKey createNonceKey(final long nonceGroup, final long nonce) {<a name="line.859"></a>
+<span class="sourceLineNo">860</span>    return (nonce == HConstants.NO_NONCE) ? null : new NonceKey(nonceGroup, nonce);<a name="line.860"></a>
+<span class="sourceLineNo">861</span>  }<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>   * Register a nonce for a procedure that is going to be submitted.<a name="line.864"></a>
+<span class="sourceLineNo">865</span>   * A procId will be reserved and on submitProcedure(),<a name="line.865"></a>
+<span class="sourceLineNo">866</span>   * the procedure with the specified nonce will take the reserved ProcId.<a name="line.866"></a>
+<span class="sourceLineNo">867</span>   * If someone already reserved the nonce, this method will return the procId reserved,<a name="line.867"></a>
+<span class="sourceLineNo">868</span>   * otherwise an invalid procId will be returned. and the caller should procede<a name="line.868"></a>
+<span class="sourceLineNo">869</span>   * and submit the procedure.<a name="line.869"></a>
+<span class="sourceLineNo">870</span>   *<a name="line.870"></a>
+<span class="sourceLineNo">871</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.871"></a>
+<span class="sourceLineNo">872</span>   * @return the procId associated with the nonce, if any otherwise an invalid procId.<a name="line.872"></a>
+<span class="sourceLineNo">873</span>   */<a name="line.873"></a>
+<span class="sourceLineNo">874</span>  public long registerNonce(final NonceKey nonceKey) {<a name="line.874"></a>
+<span class="sourceLineNo">875</span>    if (nonceKey == null) return -1;<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>    // check if we have already a Reserved ID for the nonce<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    Long oldProcId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    if (oldProcId == null) {<a name="line.879"></a>
+<span class="sourceLineNo">880</span>      // reserve a new Procedure ID, this will be associated with the nonce<a name="line.880"></a>
+<span class="sourceLineNo">881</span>      // and the procedure submitted with the specified nonce will use this ID.<a name="line.881"></a>
+<span class="sourceLineNo">882</span>      final long newProcId = nextProcId();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>      oldProcId = nonceKeysToProcIdsMap.putIfAbsent(nonceKey, newProcId);<a name="line.883"></a>
+<span class="sourceLineNo">884</span>      if (oldProcId == null) return -1;<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    }<a name="line.885"></a>
+<span class="sourceLineNo">886</span><a name="line.886"></a>
+<span class="sourceLineNo">887</span>    // we found a registered nonce, but the procedure may not have been submitted yet.<a name="line.887"></a>
+<span class="sourceLineNo">888</span>    // since the client expect the procedure to be submitted, spin here until it is.<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    final boolean traceEnabled = LOG.isTraceEnabled();<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    while (isRunning() &amp;&amp;<a name="line.890"></a>
+<span class="sourceLineNo">891</span>           !(procedures.containsKey(oldProcId) || completed.containsKey(oldProcId)) &amp;&amp;<a name="line.891"></a>
+<span class="sourceLineNo">892</span>           nonceKeysToProcIdsMap.containsKey(nonceKey)) {<a name="line.892"></a>
+<span class="sourceLineNo">893</span>      if (traceEnabled) {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>        LOG.trace("Waiting for pid=" + oldProcId.longValue() + " to be submitted");<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      }<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      Threads.sleep(100);<a name="line.896"></a>
+<span class="sourceLineNo">897</span>    }<a name="line.897"></a>
+<span class="sourceLineNo">898</span>    return oldProcId.longValue();<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>  /**<a name="line.901"></a>
+<span class="sourceLineNo">902</span>   * Remove the NonceKey if the procedure was not submitted to the executor.<a name="line.902"></a>
+<span class="sourceLineNo">903</span>   * @param nonceKey A unique identifier for this operation from the client or process.<a name="line.903"></a>
+<span class="sourceLineNo">904</span>   */<a name="line.904"></a>
+<span class="sourceLineNo">905</span>  public void unregisterNonceIfProcedureWasNotSubmitted(final NonceKey nonceKey) {<a name="line.905"></a>
+<span class="sourceLineNo">906</span>    if (nonceKey == null) return;<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>    final Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.908"></a>
+<span class="sourceLineNo">909</span>    if (procId == null) return;<a name="line.909"></a>
+<span class="sourceLineNo">910</span><a name="line.910"></a>
+<span class="sourceLineNo">911</span>    // if the procedure was not submitted, remove the nonce<a name="line.911"></a>
+<span class="sourceLineNo">912</span>    if (!(procedures.containsKey(procId) || completed.containsKey(procId))) {<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      nonceKeysToProcIdsMap.remove(nonceKey);<a name="line.913"></a>
+<span class="sourceLineNo">914</span>    }<a name="line.914"></a>
+<span class="sourceLineNo">915</span>  }<a name="line.915"></a>
+<span class="sourceLineNo">916</span><a name="line.916"></a>
+<span class="sourceLineNo">917</span>  public static class FailedProcedure&lt;TEnvironment&gt; extends Procedure&lt;TEnvironment&gt; {<a name="line.917"></a>
+<span class="sourceLineNo">918</span>    private String procName;<a name="line.918"></a>
+<span class="sourceLineNo">919</span><a name="line.919"></a>
+<span class="sourceLineNo">920</span>    public FailedProcedure() {<a name="line.920"></a>
+<span class="sourceLineNo">921</span>    }<a name="line.921"></a>
+<span class="sourceLineNo">922</span><a name="line.922"></a>
+<span class="sourceLineNo">923</span>    public FailedProcedure(long procId, String procName, User owner,<a name="line.923"></a>
+<span class="sourceLineNo">924</span>        NonceKey nonceKey, IOException exception) {<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      this.procName = procName;<a name="line.925"></a>
+<span class="sourceLineNo">926</span>      setProcId(procId);<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      setState(ProcedureState.ROLLEDBACK);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      setOwner(owner);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      setNonceKey(nonceKey);<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      long currentTime = EnvironmentEdgeManager.currentTime();<a name="line.930"></a>
+<span class="sourceLineNo">931</span>      setSubmittedTime(currentTime);<a name="line.931"></a>
+<span class="sourceLineNo">932</span>      setLastUpdate(currentTime);<a name="line.932"></a>
+<span class="sourceLineNo">933</span>      setFailure(Objects.toString(exception.getMessage(), ""), exception);<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>    @Override<a name="line.936"></a>
+<span class="sourceLineNo">937</span>    public String getProcName() {<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      return procName;<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>    @Override<a name="line.941"></a>
+<span class="sourceLineNo">942</span>    protected Procedure&lt;TEnvironment&gt;[] execute(TEnvironment env)<a name="line.942"></a>
+<span class="sourceLineNo">943</span>        throws ProcedureYieldException, ProcedureSuspendedException,<a name="line.943"></a>
+<span class="sourceLineNo">944</span>        InterruptedException {<a name="line.944"></a>
+<span class="sourceLineNo">945</span>      throw new UnsupportedOperationException();<a name="line.945"></a>
+<span class="sourceLineNo">946</span>    }<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>    @Override<a name="line.948"></a>
+<span class="sourceLineNo">949</span>    protected void rollback(TEnvironment env)<a name="line.949"></a>
+<span class="sourceLineNo">950</span>        throws IOException, InterruptedException {<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      throw new UnsupportedOperationException();<a name="line.951"></a>
+<span class="sourceLineNo">952</span>    }<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>    @Override<a name="line.954"></a>
+<span class="sourceLineNo">955</span>    protected boolean abort(TEnvironment env) {<a name="line.955"></a>
+<span class="sourceLineNo">956</span>      throw new UnsupportedOperationException();<a name="line.956"></a>
+<span class="sourceLineNo">957</span>    }<a name="line.957"></a>
+<span class="sourceLineNo">958</span><a name="line.958"></a>
+<span class="sourceLineNo">959</span>    @Override<a name="line.959"></a>
+<span class="sourceLineNo">960</span>    protected void serializeStateData(ProcedureStateSerializer serializer)<a name="line.960"></a>
+<span class="sourceLineNo">961</span>        throws IOException {<a name="line.961"></a>
+<span class="sourceLineNo">962</span>    }<a name="line.962"></a>
+<span class="sourceLineNo">963</span><a name="line.963"></a>
+<span class="sourceLineNo">964</span>    @Override<a name="line.964"></a>
+<span class="sourceLineNo">965</span>    protected void deserializeStateData(ProcedureStateSerializer serializer)<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        throws IOException {<a name="line.966"></a>
+<span class="sourceLineNo">967</span>    }<a name="line.967"></a>
+<span class="sourceLineNo">968</span>  }<a name="line.968"></a>
+<span class="sourceLineNo">969</span><a name="line.969"></a>
+<span class="sourceLineNo">970</span>  /**<a name="line.970"></a>
+<span class="sourceLineNo">971</span>   * If the failure failed before submitting it, we may want to give back the<a name="line.971"></a>
+<span class="sourceLineNo">972</span>   * same error to the requests with the same nonceKey.<a name="line.972"></a>
+<span class="sourceLineNo">973</span>   *<a name="line.973"></a>
+<span class="sourceLineNo">974</span>   * @param nonceKey A unique identifier for this operation from the client or process<a name="line.974"></a>
+<span class="sourceLineNo">975</span>   * @param procName name of the procedure, used to inform the user<a name="line.975"></a>
+<span class="sourceLineNo">976</span>   * @param procOwner name of the owner of the procedure, used to inform the user<a name="line.976"></a>
+<span class="sourceLineNo">977</span>   * @param exception the failure to report to the user<a name="line.977"></a>
+<span class="sourceLineNo">978</span>   */<a name="line.978"></a>
+<span class="sourceLineNo">979</span>  public void setFailureResultForNonce(NonceKey nonceKey, String procName, User procOwner,<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      IOException exception) {<a name="line.980"></a>
+<span class="sourceLineNo">981</span>    if (nonceKey == null) {<a name="line.981"></a>
+<span class="sourceLineNo">982</span>      return;<a name="line.982"></a>
+<span class="sourceLineNo">983</span>    }<a name="line.983"></a>
+<span class="sourceLineNo">984</span><a name="line.984"></a>
+<span class="sourceLineNo">985</span>    Long procId = nonceKeysToProcIdsMap.get(nonceKey);<a name="line.985"></a>
+<span class="sourceLineNo">986</span>    if (procId == null || completed.containsKey(procId)) {<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      return;<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    }<a name="line.988"></a>
+<span class="sourceLineNo">989</span><a name="line.989"></a>
+<span class="sourceLineNo">990</span>    Procedure&lt;TEnvironment&gt; proc =<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      new FailedProcedure&lt;&gt;(procId.longValue(), procName, procOwner, nonceKey, exception);<a name="line.991"></a>
+<span class="sourceLineNo">992</span><a name="line.992"></a>
+<span class="sourceLineNo">993</span>    completed.putIfAbsent(procId, new CompletedProcedureRetainer&lt;&gt;(proc));<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  // ==========================================================================<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  //  Submit/Abort Procedure<a name="line.997"></a>
 <span class="sourceLineNo">998</span>  // ==========================================================================<a name="line.998"></a>
-<span class="sourceLineNo">999</span>  //  Submit/Abort Procedure<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>  // ==========================================================================<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>  /**<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>   * Add a new root-procedure to the executor.<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>   * @param proc the new procedure to execute.<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span>   * @return the procedure id, that can be used to monitor the operation<a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>   */<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>  public long submitProcedure(Procedure&lt;TEnvironment&gt; proc) {<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    return submitProcedure(proc, null);<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>  }<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span><a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>  /**<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span>   * Bypass a procedure. If the procedure is set to bypass, all the logic in<a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>   * execute/rollback will be ignored and it will return success, whatever.<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>   * It is used to recover buggy stuck procedures, releasing the lock resources<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span>   * and letting other procedures run. Bypassing one procedure (and its ancestors will<a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>   * be bypassed automatically) may leave the cluster in a middle state, e.g. region<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>   * not assigned, or some hdfs files left behind. After getting rid of those stuck procedures,<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>   * the operators may have to do some clean up on hdfs or schedule some assign procedures<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>   * to let region online. DO AT YOUR OWN RISK.<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>   * &lt;p&gt;<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>   * A procedure can be bypassed only if<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span>   * 1. The procedure is in state of RUNNABLE, WAITING, WAITING_TIMEOUT<a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>   * or it is a root procedure without any child.<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>   * 2. No other worker thread is executing it<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>   * 3. No child procedure has been submitted<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>   *<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>   * &lt;p&gt;<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>   * If all the requirements are meet, the procedure and its ancestors will be<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span>   * bypassed and persisted to WAL.<a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>   *<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>   * &lt;p&gt;<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>   * If the procedure is in WAITING state, will set it to RUNNABLE add it to run queue.<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>   * TODO: What about WAITING_TIMEOUT?<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>   * @param pids the procedure id<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>   * @param lockWait time to wait lock<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>   * @param force if force set to true, we will bypass the procedure even if it is executing.<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>   *              This is for procedures which can't break out during executing(due to bug, mostly)<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>   *              In this case, bypassing the procedure is not enough, since it is already stuck<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>   *              there. We need to restart the master after bypassing, and letting the problematic<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>   *              procedure to execute wth bypass=true, so in that condition, the procedure can be<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>   *              successfully bypassed.<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>   * @param recursive We will do an expensive search for children of each pid. EXPENSIVE!<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>   * @return true if bypass success<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>   * @throws IOException IOException<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>   */<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>  public List&lt;Boolean&gt; bypassProcedure(List&lt;Long&gt; pids, long lockWait, boolean force,<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>      boolean recursive)<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>      throws IOException {<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>    List&lt;Boolean&gt; result = new ArrayList&lt;Boolean&gt;(pids.size());<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>    for(long pid: pids) {<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>      result.add(bypassProcedure(pid, lockWait, force, recursive));<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>    }<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>    return result;<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>  }<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span><a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>  boolean bypassProcedure(long pid, long lockWait, boolean override, boolean recursive)<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>      throws IOException {<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>    Preconditions.checkArgument(lockWait &gt; 0, "lockWait should be positive");<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>    final Procedure&lt;TEnvironment&gt; procedure = getProcedure(pid);<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>    if (procedure == null) {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>      LOG.debug("Procedure pid={} does not exist, skipping bypass", pid);<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>      return false;<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>    }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>    LOG.debug("Begin bypass {} with lockWait={}, override={}, recursive={}",<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>        procedure, lockWait, override, recursive);<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>    IdLock.Entry lockEntry = procExecutionLock.tryLockEntry(procedure.getProcId(), lockWait);<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span>    if (lockEntry == null &amp;&amp; !override) {<a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>      LOG.debug("Waited {} ms, but {} is still running, skipping bypass with force={}",<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span>          lockWait, procedure, override);<a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>      return false;<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span>    } else if (lockEntry == null) {<a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>      LOG.debug("Waited {} ms, but {} is still running, begin bypass with force={}",<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span>          lockWait, procedure, override);<a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>    }<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>    try {<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>      // check whether the procedure is already finished<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span>      if (procedure.isFinished()) {<a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        LOG.debug("{} is already finished, skipping bypass", procedure);<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>        return false;<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>      }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span><a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      if (procedure.hasChildren()) {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (recursive) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          // EXPENSIVE. Checks each live procedure of which there could be many!!!<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>          // Is there another way to get children of a procedure?<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          LOG.info("Recursive bypass on children of pid={}", procedure.getProcId());<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>          this.procedures.forEachValue(1 /*Single-threaded*/,<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            // Transformer<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>            v -&gt; v.getParentProcId() == procedure.getProcId()? v: null,<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>            // Consumer<a name="line.1090

<TRUNCATED>

[02/30] hbase-site git commit: Published site at 931156f66b1decc19d89f8bb3ce9e5f355fb4fb2.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6b8b907f/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAdmin2.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAdmin2.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAdmin2.html
index 7c5f71e..02d694d 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAdmin2.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestAdmin2.html
@@ -56,713 +56,752 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.UnknownRegionException;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.ZooKeeperConnectionException;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.constraint.ConstraintException;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.junit.After;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.junit.AfterClass;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.junit.Before;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.junit.BeforeClass;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.junit.ClassRule;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.junit.Rule;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.junit.Test;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.junit.experimental.categories.Category;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.junit.rules.TestName;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.slf4j.Logger;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.slf4j.LoggerFactory;<a name="line.70"></a>
-<span class="sourceLineNo">071</span><a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<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> * Class to test HBaseAdmin.<a name="line.75"></a>
-<span class="sourceLineNo">076</span> * Spins up the minicluster once at test start and then takes it down afterward.<a name="line.76"></a>
-<span class="sourceLineNo">077</span> * Add any testing of HBaseAdmin functionality here.<a name="line.77"></a>
-<span class="sourceLineNo">078</span> */<a name="line.78"></a>
-<span class="sourceLineNo">079</span>@Category({LargeTests.class, ClientTests.class})<a name="line.79"></a>
-<span class="sourceLineNo">080</span>public class TestAdmin2 {<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  @ClassRule<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.83"></a>
-<span class="sourceLineNo">084</span>      HBaseClassTestRule.forClass(TestAdmin2.class);<a name="line.84"></a>
-<span class="sourceLineNo">085</span><a name="line.85"></a>
-<span class="sourceLineNo">086</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAdmin2.class);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  private Admin admin;<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>  @Rule<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  public TestName name = new TestName();<a name="line.91"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.ipc.HBaseRpcController;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.master.assignment.AssignmentManager;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.regionserver.HStore;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.junit.After;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.junit.AfterClass;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.junit.Assert;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.junit.Before;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.junit.BeforeClass;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.junit.ClassRule;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.Rule;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.Test;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.experimental.categories.Category;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.rules.TestName;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.slf4j.Logger;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.slf4j.LoggerFactory;<a name="line.73"></a>
+<span class="sourceLineNo">074</span><a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<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> * Class to test HBaseAdmin.<a name="line.78"></a>
+<span class="sourceLineNo">079</span> * Spins up the minicluster once at test start and then takes it down afterward.<a name="line.79"></a>
+<span class="sourceLineNo">080</span> * Add any testing of HBaseAdmin functionality here.<a name="line.80"></a>
+<span class="sourceLineNo">081</span> */<a name="line.81"></a>
+<span class="sourceLineNo">082</span>@Category({LargeTests.class, ClientTests.class})<a name="line.82"></a>
+<span class="sourceLineNo">083</span>public class TestAdmin2 {<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @ClassRule<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      HBaseClassTestRule.forClass(TestAdmin2.class);<a name="line.87"></a>
+<span class="sourceLineNo">088</span><a name="line.88"></a>
+<span class="sourceLineNo">089</span>  private static final Logger LOG = LoggerFactory.getLogger(TestAdmin2.class);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  private Admin admin;<a name="line.91"></a>
 <span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  @BeforeClass<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  public static void setUpBeforeClass() throws Exception {<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    TEST_UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 250);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    TEST_UTIL.getConfiguration().setInt("hbase.client.retries.number", 6);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    TEST_UTIL.getConfiguration().setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 30);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    TEST_UTIL.getConfiguration().setInt(HConstants.REGION_SERVER_HANDLER_COUNT, 30);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    TEST_UTIL.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", true);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    TEST_UTIL.startMiniCluster(3);<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>  @AfterClass<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public static void tearDownAfterClass() throws Exception {<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  }<a name="line.107"></a>
-<span class="sourceLineNo">108</span><a name="line.108"></a>
-<span class="sourceLineNo">109</span>  @Before<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  public void setUp() throws Exception {<a name="line.110"></a>
-<span class="sourceLineNo">111</span>    this.admin = TEST_UTIL.getHBaseAdmin();<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>  @After<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  public void tearDown() throws Exception {<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    for (HTableDescriptor htd : this.admin.listTables()) {<a name="line.116"></a>
-<span class="sourceLineNo">117</span>      TEST_UTIL.deleteTable(htd.getTableName());<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><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  @Test<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public void testCreateBadTables() throws IOException {<a name="line.122"></a>
-<span class="sourceLineNo">123</span>    String msg = null;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>    try {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>      this.admin.createTable(new HTableDescriptor(TableName.META_TABLE_NAME));<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    } catch(TableExistsException e) {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>      msg = e.toString();<a name="line.127"></a>
-<span class="sourceLineNo">128</span>    }<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    assertTrue("Unexcepted exception message " + msg, msg != null &amp;&amp;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      msg.startsWith(TableExistsException.class.getName()) &amp;&amp;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>      msg.contains(TableName.META_TABLE_NAME.getNameAsString()));<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // Now try and do concurrent creation with a bunch of threads.<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    final HTableDescriptor threadDesc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    threadDesc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    int count = 10;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>    Thread [] threads = new Thread [count];<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    final AtomicInteger successes = new AtomicInteger(0);<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    final AtomicInteger failures = new AtomicInteger(0);<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    final Admin localAdmin = this.admin;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    for (int i = 0; i &lt; count; i++) {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>      threads[i] = new Thread(Integer.toString(i)) {<a name="line.142"></a>
-<span class="sourceLineNo">143</span>        @Override<a name="line.143"></a>
-<span class="sourceLineNo">144</span>        public void run() {<a name="line.144"></a>
-<span class="sourceLineNo">145</span>          try {<a name="line.145"></a>
-<span class="sourceLineNo">146</span>            localAdmin.createTable(threadDesc);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>            successes.incrementAndGet();<a name="line.147"></a>
-<span class="sourceLineNo">148</span>          } catch (TableExistsException e) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>            failures.incrementAndGet();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>          } catch (IOException e) {<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            throw new RuntimeException("Failed threaded create" + getName(), e);<a name="line.151"></a>
-<span class="sourceLineNo">152</span>          }<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        }<a name="line.153"></a>
-<span class="sourceLineNo">154</span>      };<a name="line.154"></a>
-<span class="sourceLineNo">155</span>    }<a name="line.155"></a>
-<span class="sourceLineNo">156</span>    for (int i = 0; i &lt; count; i++) {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>      threads[i].start();<a name="line.157"></a>
+<span class="sourceLineNo">093</span>  @Rule<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  public TestName name = new TestName();<a name="line.94"></a>
+<span class="sourceLineNo">095</span><a name="line.95"></a>
+<span class="sourceLineNo">096</span>  @BeforeClass<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  public static void setUpBeforeClass() throws Exception {<a name="line.97"></a>
+<span class="sourceLineNo">098</span>    TEST_UTIL.getConfiguration().setInt("hbase.regionserver.msginterval", 100);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 250);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    TEST_UTIL.getConfiguration().setInt("hbase.client.retries.number", 6);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    TEST_UTIL.getConfiguration().setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 30);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    TEST_UTIL.getConfiguration().setInt(HConstants.REGION_SERVER_HANDLER_COUNT, 30);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    TEST_UTIL.getConfiguration().setBoolean("hbase.master.enabletable.roundrobin", true);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    TEST_UTIL.startMiniCluster(3);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
+<span class="sourceLineNo">106</span><a name="line.106"></a>
+<span class="sourceLineNo">107</span>  @AfterClass<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  public static void tearDownAfterClass() throws Exception {<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    TEST_UTIL.shutdownMiniCluster();<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  }<a name="line.110"></a>
+<span class="sourceLineNo">111</span><a name="line.111"></a>
+<span class="sourceLineNo">112</span>  @Before<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public void setUp() throws Exception {<a name="line.113"></a>
+<span class="sourceLineNo">114</span>    this.admin = TEST_UTIL.getHBaseAdmin();<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>  @After<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public void tearDown() throws Exception {<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    for (HTableDescriptor htd : this.admin.listTables()) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>      TEST_UTIL.deleteTable(htd.getTableName());<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    }<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @Test<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public void testCreateBadTables() throws IOException {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    String msg = null;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    try {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>      this.admin.createTable(new HTableDescriptor(TableName.META_TABLE_NAME));<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    } catch(TableExistsException e) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      msg = e.toString();<a name="line.130"></a>
+<span class="sourceLineNo">131</span>    }<a name="line.131"></a>
+<span class="sourceLineNo">132</span>    assertTrue("Unexcepted exception message " + msg, msg != null &amp;&amp;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>      msg.startsWith(TableExistsException.class.getName()) &amp;&amp;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      msg.contains(TableName.META_TABLE_NAME.getNameAsString()));<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>    // Now try and do concurrent creation with a bunch of threads.<a name="line.136"></a>
+<span class="sourceLineNo">137</span>    final HTableDescriptor threadDesc = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    threadDesc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.138"></a>
+<span class="sourceLineNo">139</span>    int count = 10;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    Thread [] threads = new Thread [count];<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    final AtomicInteger successes = new AtomicInteger(0);<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    final AtomicInteger failures = new AtomicInteger(0);<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    final Admin localAdmin = this.admin;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    for (int i = 0; i &lt; count; i++) {<a name="line.144"></a>
+<span class="sourceLineNo">145</span>      threads[i] = new Thread(Integer.toString(i)) {<a name="line.145"></a>
+<span class="sourceLineNo">146</span>        @Override<a name="line.146"></a>
+<span class="sourceLineNo">147</span>        public void run() {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>          try {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>            localAdmin.createTable(threadDesc);<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            successes.incrementAndGet();<a name="line.150"></a>
+<span class="sourceLineNo">151</span>          } catch (TableExistsException e) {<a name="line.151"></a>
+<span class="sourceLineNo">152</span>            failures.incrementAndGet();<a name="line.152"></a>
+<span class="sourceLineNo">153</span>          } catch (IOException e) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>            throw new RuntimeException("Failed threaded create" + getName(), e);<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>    }<a name="line.158"></a>
 <span class="sourceLineNo">159</span>    for (int i = 0; i &lt; count; i++) {<a name="line.159"></a>
-<span class="sourceLineNo">160</span>      while(threads[i].isAlive()) {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>        try {<a name="line.161"></a>
-<span class="sourceLineNo">162</span>          Thread.sleep(100);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>        } catch (InterruptedException e) {<a name="line.163"></a>
-<span class="sourceLineNo">164</span>          // continue<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>    // All threads are now dead.  Count up how many tables were created and<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    // how many failed w/ appropriate exception.<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    assertEquals(1, successes.get());<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    assertEquals(count - 1, failures.get());<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>  /**<a name="line.174"></a>
-<span class="sourceLineNo">175</span>   * Test for hadoop-1581 'HBASE: Unopenable tablename bug'.<a name="line.175"></a>
-<span class="sourceLineNo">176</span>   * @throws Exception<a name="line.176"></a>
-<span class="sourceLineNo">177</span>   */<a name="line.177"></a>
-<span class="sourceLineNo">178</span>  @Test<a name="line.178"></a>
-<span class="sourceLineNo">179</span>  public void testTableNameClash() throws Exception {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    final String name = this.name.getMethodName();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    HTableDescriptor htd1 = new HTableDescriptor(TableName.valueOf(name + "SOMEUPPERCASE"));<a name="line.181"></a>
-<span class="sourceLineNo">182</span>    HTableDescriptor htd2 = new HTableDescriptor(TableName.valueOf(name));<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    htd1.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    htd2.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    admin.createTable(htd1);<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    admin.createTable(htd2);<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    // Before fix, below would fail throwing a NoServerForRegionException.<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    TEST_UTIL.getConnection().getTable(htd2.getTableName()).close();<a name="line.188"></a>
-<span class="sourceLineNo">189</span>  }<a name="line.189"></a>
-<span class="sourceLineNo">190</span><a name="line.190"></a>
-<span class="sourceLineNo">191</span>  /***<a name="line.191"></a>
-<span class="sourceLineNo">192</span>   * HMaster.createTable used to be kind of synchronous call<a name="line.192"></a>
-<span class="sourceLineNo">193</span>   * Thus creating of table with lots of regions can cause RPC timeout<a name="line.193"></a>
-<span class="sourceLineNo">194</span>   * After the fix to make createTable truly async, RPC timeout shouldn't be an<a name="line.194"></a>
-<span class="sourceLineNo">195</span>   * issue anymore<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * @throws Exception<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   */<a name="line.197"></a>
-<span class="sourceLineNo">198</span>  @Test<a name="line.198"></a>
-<span class="sourceLineNo">199</span>  public void testCreateTableRPCTimeOut() throws Exception {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    final String name = this.name.getMethodName();<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    int oldTimeout = TEST_UTIL.getConfiguration().<a name="line.201"></a>
-<span class="sourceLineNo">202</span>      getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT);<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, 1500);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>    try {<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      int expectedRegions = 100;<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      // Use 80 bit numbers to make sure we aren't limited<a name="line.206"></a>
-<span class="sourceLineNo">207</span>      byte [] startKey = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      byte [] endKey =   { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      Admin hbaseadmin = TEST_UTIL.getHBaseAdmin();<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name));<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      htd.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.211"></a>
-<span class="sourceLineNo">212</span>      hbaseadmin.createTable(htd, startKey, endKey, expectedRegions);<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    } finally {<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, oldTimeout);<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    }<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
-<span class="sourceLineNo">217</span><a name="line.217"></a>
-<span class="sourceLineNo">218</span>  /**<a name="line.218"></a>
-<span class="sourceLineNo">219</span>   * Test read only tables<a name="line.219"></a>
-<span class="sourceLineNo">220</span>   * @throws Exception<a name="line.220"></a>
-<span class="sourceLineNo">221</span>   */<a name="line.221"></a>
-<span class="sourceLineNo">222</span>  @Test<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public void testReadOnlyTable() throws Exception {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Table table = TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    byte[] value = Bytes.toBytes("somedata");<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    // This used to use an empty row... That must have been a bug<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    Put put = new Put(value);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    put.addColumn(HConstants.CATALOG_FAMILY, HConstants.CATALOG_FAMILY, value);<a name="line.229"></a>
-<span class="sourceLineNo">230</span>    table.put(put);<a name="line.230"></a>
-<span class="sourceLineNo">231</span>    table.close();<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>   * Test that user table names can contain '-' and '.' so long as they do not<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   * start with same. HBASE-771<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * @throws IOException<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   */<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  @Test<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public void testTableNames() throws IOException {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    byte[][] illegalNames = new byte[][] {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>        Bytes.toBytes("-bad"),<a name="line.242"></a>
-<span class="sourceLineNo">243</span>        Bytes.toBytes(".bad")<a name="line.243"></a>
-<span class="sourceLineNo">244</span>    };<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    for (byte[] illegalName : illegalNames) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      try {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        new HTableDescriptor(TableName.valueOf(illegalName));<a name="line.247"></a>
-<span class="sourceLineNo">248</span>        throw new IOException("Did not detect '" +<a name="line.248"></a>
-<span class="sourceLineNo">249</span>            Bytes.toString(illegalName) + "' as an illegal user table name");<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      } catch (IllegalArgumentException e) {<a name="line.250"></a>
-<span class="sourceLineNo">251</span>        // expected<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>    byte[] legalName = Bytes.toBytes("g-oo.d");<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    try {<a name="line.255"></a>
-<span class="sourceLineNo">256</span>      new HTableDescriptor(TableName.valueOf(legalName));<a name="line.256"></a>
-<span class="sourceLineNo">257</span>    } catch (IllegalArgumentException e) {<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      throw new IOException("Legal user table name: '" +<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        Bytes.toString(legalName) + "' caused IllegalArgumentException: " +<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        e.getMessage());<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>  /**<a name="line.264"></a>
-<span class="sourceLineNo">265</span>   * For HADOOP-2579<a name="line.265"></a>
-<span class="sourceLineNo">266</span>   * @throws IOException<a name="line.266"></a>
-<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
-<span class="sourceLineNo">268</span>  @Test (expected=TableExistsException.class)<a name="line.268"></a>
-<span class="sourceLineNo">269</span>  public void testTableExistsExceptionWithATable() throws IOException {<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY).close();<a name="line.271"></a>
-<span class="sourceLineNo">272</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<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>   * Can't disable a table if the table isn't in enabled state<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   * @throws IOException<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   */<a name="line.278"></a>
-<span class="sourceLineNo">279</span>  @Test (expected=TableNotEnabledException.class)<a name="line.279"></a>
-<span class="sourceLineNo">280</span>  public void testTableNotEnabledExceptionWithATable() throws IOException {<a name="line.280"></a>
-<span class="sourceLineNo">281</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.281"></a>
-<span class="sourceLineNo">282</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY).close();<a name="line.282"></a>
-<span class="sourceLineNo">283</span>    this.admin.disableTable(name);<a name="line.283"></a>
-<span class="sourceLineNo">284</span>    this.admin.disableTable(name);<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>  /**<a name="line.287"></a>
-<span class="sourceLineNo">288</span>   * Can't enable a table if the table isn't in disabled state<a name="line.288"></a>
-<span class="sourceLineNo">289</span>   * @throws IOException<a name="line.289"></a>
-<span class="sourceLineNo">290</span>   */<a name="line.290"></a>
-<span class="sourceLineNo">291</span>  @Test (expected=TableNotDisabledException.class)<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public void testTableNotDisabledExceptionWithATable() throws IOException {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Table t = TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    this.admin.enableTable(name);<a name="line.296"></a>
-<span class="sourceLineNo">297</span>    }finally {<a name="line.297"></a>
-<span class="sourceLineNo">298</span>       t.close();<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>  /**<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * For HADOOP-2579<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * @throws IOException<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  @Test (expected=TableNotFoundException.class)<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public void testTableNotFoundExceptionWithoutAnyTables() throws IOException {<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    TableName tableName = TableName<a name="line.308"></a>
-<span class="sourceLineNo">309</span>        .valueOf("testTableNotFoundExceptionWithoutAnyTables");<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    Table ht = TEST_UTIL.getConnection().getTable(tableName);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>    ht.get(new Get(Bytes.toBytes("e")));<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>  @Test<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  public void testShouldUnassignTheRegion() throws Exception {<a name="line.315"></a>
-<span class="sourceLineNo">316</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    createTableWithDefaultConf(tableName);<a name="line.317"></a>
-<span class="sourceLineNo">318</span><a name="line.318"></a>
-<span class="sourceLineNo">319</span>    RegionInfo info = null;<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      if (!regionInfo.getTable().isSystemTable()) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>        info = regionInfo;<a name="line.324"></a>
-<span class="sourceLineNo">325</span>        admin.unassign(regionInfo.getRegionName(), true);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      }<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    }<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    boolean isInList = ProtobufUtil.getOnlineRegions(<a name="line.328"></a>
-<span class="sourceLineNo">329</span>      rs.getRSRpcServices()).contains(info);<a name="line.329"></a>
-<span class="sourceLineNo">330</span>    long timeout = System.currentTimeMillis() + 10000;<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    while ((System.currentTimeMillis() &lt; timeout) &amp;&amp; (isInList)) {<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      Thread.sleep(100);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      isInList = ProtobufUtil.getOnlineRegions(<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        rs.getRSRpcServices()).contains(info);<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>    assertFalse("The region should not be present in online regions list.",<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      isInList);<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>  @Test<a name="line.341"></a>
-<span class="sourceLineNo">342</span>  public void testCloseRegionIfInvalidRegionNameIsPassed() throws Exception {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>    final String name = this.name.getMethodName();<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    byte[] tableName = Bytes.toBytes(name);<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    createTableWithDefaultConf(tableName);<a name="line.345"></a>
-<span class="sourceLineNo">346</span><a name="line.346"></a>
-<span class="sourceLineNo">347</span>    RegionInfo info = null;<a name="line.347"></a>
-<span class="sourceLineNo">348</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(TableName.valueOf(tableName));<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      if (!regionInfo.isMetaRegion()) {<a name="line.351"></a>
-<span class="sourceLineNo">352</span>        if (regionInfo.getRegionNameAsString().contains(name)) {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          info = regionInfo;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>          try {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>            admin.unassign(Bytes.toBytes("sample"), true);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>          } catch (UnknownRegionException nsre) {<a name="line.356"></a>
-<span class="sourceLineNo">357</span>            // expected, ignore it<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>      }<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    }<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    assertTrue("The region should be present in online regions list.",<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        onlineRegions.contains(info));<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>  @Test<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  public void testCloseRegionThatFetchesTheHRIFromMeta() throws Exception {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.369"></a>
-<span class="sourceLineNo">370</span>    createTableWithDefaultConf(tableName);<a name="line.370"></a>
-<span class="sourceLineNo">371</span><a name="line.371"></a>
-<span class="sourceLineNo">372</span>    RegionInfo info = null;<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.374"></a>
-<span class="sourceLineNo">375</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      if (!regionInfo.isMetaRegion()) {<a name="line.376"></a>
-<span class="sourceLineNo">377</span>        if (regionInfo.getRegionNameAsString().contains("TestHBACloseRegion2")) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>          info = regionInfo;<a name="line.378"></a>
-<span class="sourceLineNo">379</span>          admin.unassign(regionInfo.getRegionName(), true);<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><a name="line.383"></a>
-<span class="sourceLineNo">384</span>    boolean isInList = ProtobufUtil.getOnlineRegions(<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      rs.getRSRpcServices()).contains(info);<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    long timeout = System.currentTimeMillis() + 10000;<a name="line.386"></a>
-<span class="sourceLineNo">387</span>    while ((System.currentTimeMillis() &lt; timeout) &amp;&amp; (isInList)) {<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      Thread.sleep(100);<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      isInList = ProtobufUtil.getOnlineRegions(<a name="line.389"></a>
-<span class="sourceLineNo">390</span>        rs.getRSRpcServices()).contains(info);<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>    assertFalse("The region should not be present in online regions list.",<a name="line.393"></a>
-<span class="sourceLineNo">394</span>      isInList);<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>  private HBaseAdmin createTable(TableName tableName) throws IOException {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    HBaseAdmin admin = TEST_UTIL.getHBaseAdmin();<a name="line.398"></a>
+<span class="sourceLineNo">160</span>      threads[i].start();<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    for (int i = 0; i &lt; count; i++) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      while(threads[i].isAlive()) {<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        try {<a name="line.164"></a>
+<span class="sourceLineNo">165</span>          Thread.sleep(100);<a name="line.165"></a>
+<span class="sourceLineNo">166</span>        } catch (InterruptedException e) {<a name="line.166"></a>
+<span class="sourceLineNo">167</span>          // continue<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>    }<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    // All threads are now dead.  Count up how many tables were created and<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    // how many failed w/ appropriate exception.<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    assertEquals(1, successes.get());<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    assertEquals(count - 1, failures.get());<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>  /**<a name="line.177"></a>
+<span class="sourceLineNo">178</span>   * Test for hadoop-1581 'HBASE: Unopenable tablename bug'.<a name="line.178"></a>
+<span class="sourceLineNo">179</span>   * @throws Exception<a name="line.179"></a>
+<span class="sourceLineNo">180</span>   */<a name="line.180"></a>
+<span class="sourceLineNo">181</span>  @Test<a name="line.181"></a>
+<span class="sourceLineNo">182</span>  public void testTableNameClash() throws Exception {<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    final String name = this.name.getMethodName();<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    HTableDescriptor htd1 = new HTableDescriptor(TableName.valueOf(name + "SOMEUPPERCASE"));<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    HTableDescriptor htd2 = new HTableDescriptor(TableName.valueOf(name));<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    htd1.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.186"></a>
+<span class="sourceLineNo">187</span>    htd2.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    admin.createTable(htd1);<a name="line.188"></a>
+<span class="sourceLineNo">189</span>    admin.createTable(htd2);<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    // Before fix, below would fail throwing a NoServerForRegionException.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    TEST_UTIL.getConnection().getTable(htd2.getTableName()).close();<a name="line.191"></a>
+<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
+<span class="sourceLineNo">193</span><a name="line.193"></a>
+<span class="sourceLineNo">194</span>  /***<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * HMaster.createTable used to be kind of synchronous call<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * Thus creating of table with lots of regions can cause RPC timeout<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   * After the fix to make createTable truly async, RPC timeout shouldn't be an<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   * issue anymore<a name="line.198"></a>
+<span class="sourceLineNo">199</span>   * @throws Exception<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   */<a name="line.200"></a>
+<span class="sourceLineNo">201</span>  @Test<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public void testCreateTableRPCTimeOut() throws Exception {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    final String name = this.name.getMethodName();<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    int oldTimeout = TEST_UTIL.getConfiguration().<a name="line.204"></a>
+<span class="sourceLineNo">205</span>      getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, HConstants.DEFAULT_HBASE_RPC_TIMEOUT);<a name="line.205"></a>
+<span class="sourceLineNo">206</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, 1500);<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    try {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>      int expectedRegions = 100;<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      // Use 80 bit numbers to make sure we aren't limited<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      byte [] startKey = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      byte [] endKey =   { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      Admin hbaseadmin = TEST_UTIL.getHBaseAdmin();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>      HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name));<a name="line.213"></a>
+<span class="sourceLineNo">214</span>      htd.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      hbaseadmin.createTable(htd, startKey, endKey, expectedRegions);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    } finally {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_RPC_TIMEOUT_KEY, oldTimeout);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  }<a name="line.219"></a>
+<span class="sourceLineNo">220</span><a name="line.220"></a>
+<span class="sourceLineNo">221</span>  /**<a name="line.221"></a>
+<span class="sourceLineNo">222</span>   * Test read only tables<a name="line.222"></a>
+<span class="sourceLineNo">223</span>   * @throws Exception<a name="line.223"></a>
+<span class="sourceLineNo">224</span>   */<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  @Test<a name="line.225"></a>
+<span class="sourceLineNo">226</span>  public void testReadOnlyTable() throws Exception {<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    Table table = TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    byte[] value = Bytes.toBytes("somedata");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    // This used to use an empty row... That must have been a bug<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    Put put = new Put(value);<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    put.addColumn(HConstants.CATALOG_FAMILY, HConstants.CATALOG_FAMILY, value);<a name="line.232"></a>
+<span class="sourceLineNo">233</span>    table.put(put);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    table.close();<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>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Test that user table names can contain '-' and '.' so long as they do not<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * start with same. HBASE-771<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @throws IOException<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   */<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  @Test<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  public void testTableNames() throws IOException {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    byte[][] illegalNames = new byte[][] {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>        Bytes.toBytes("-bad"),<a name="line.245"></a>
+<span class="sourceLineNo">246</span>        Bytes.toBytes(".bad")<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    };<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    for (byte[] illegalName : illegalNames) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      try {<a name="line.249"></a>
+<span class="sourceLineNo">250</span>        new HTableDescriptor(TableName.valueOf(illegalName));<a name="line.250"></a>
+<span class="sourceLineNo">251</span>        throw new IOException("Did not detect '" +<a name="line.251"></a>
+<span class="sourceLineNo">252</span>            Bytes.toString(illegalName) + "' as an illegal user table name");<a name="line.252"></a>
+<span class="sourceLineNo">253</span>      } catch (IllegalArgumentException e) {<a name="line.253"></a>
+<span class="sourceLineNo">254</span>        // expected<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>    byte[] legalName = Bytes.toBytes("g-oo.d");<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    try {<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      new HTableDescriptor(TableName.valueOf(legalName));<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    } catch (IllegalArgumentException e) {<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      throw new IOException("Legal user table name: '" +<a name="line.261"></a>
+<span class="sourceLineNo">262</span>        Bytes.toString(legalName) + "' caused IllegalArgumentException: " +<a name="line.262"></a>
+<span class="sourceLineNo">263</span>        e.getMessage());<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>  /**<a name="line.267"></a>
+<span class="sourceLineNo">268</span>   * For HADOOP-2579<a name="line.268"></a>
+<span class="sourceLineNo">269</span>   * @throws IOException<a name="line.269"></a>
+<span class="sourceLineNo">270</span>   */<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  @Test (expected=TableExistsException.class)<a name="line.271"></a>
+<span class="sourceLineNo">272</span>  public void testTableExistsExceptionWithATable() throws IOException {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY).close();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<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>  /**<a name="line.278"></a>
+<span class="sourceLineNo">279</span>   * Can't disable a table if the table isn't in enabled state<a name="line.279"></a>
+<span class="sourceLineNo">280</span>   * @throws IOException<a name="line.280"></a>
+<span class="sourceLineNo">281</span>   */<a name="line.281"></a>
+<span class="sourceLineNo">282</span>  @Test (expected=TableNotEnabledException.class)<a name="line.282"></a>
+<span class="sourceLineNo">283</span>  public void testTableNotEnabledExceptionWithATable() throws IOException {<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.284"></a>
+<span class="sourceLineNo">285</span>    TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY).close();<a name="line.285"></a>
+<span class="sourceLineNo">286</span>    this.admin.disableTable(name);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>    this.admin.disableTable(name);<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>   * Can't enable a table if the table isn't in disabled state<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * @throws IOException<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   */<a name="line.293"></a>
+<span class="sourceLineNo">294</span>  @Test (expected=TableNotDisabledException.class)<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  public void testTableNotDisabledExceptionWithATable() throws IOException {<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    final TableName name = TableName.valueOf(this.name.getMethodName());<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    Table t = TEST_UTIL.createTable(name, HConstants.CATALOG_FAMILY);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    try {<a name="line.298"></a>
+<span class="sourceLineNo">299</span>    this.admin.enableTable(name);<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    }finally {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>       t.close();<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>  /**<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   * For HADOOP-2579<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * @throws IOException<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   */<a name="line.308"></a>
+<span class="sourceLineNo">309</span>  @Test (expected=TableNotFoundException.class)<a name="line.309"></a>
+<span class="sourceLineNo">310</span>  public void testTableNotFoundExceptionWithoutAnyTables() throws IOException {<a name="line.310"></a>
+<span class="sourceLineNo">311</span>    TableName tableName = TableName<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        .valueOf("testTableNotFoundExceptionWithoutAnyTables");<a name="line.312"></a>
+<span class="sourceLineNo">313</span>    Table ht = TEST_UTIL.getConnection().getTable(tableName);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    ht.get(new Get(Bytes.toBytes("e")));<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>  @Test<a name="line.317"></a>
+<span class="sourceLineNo">318</span>  public void testShouldUnassignTheRegion() throws Exception {<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.319"></a>
+<span class="sourceLineNo">320</span>    createTableWithDefaultConf(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span><a name="line.321"></a>
+<span class="sourceLineNo">322</span>    RegionInfo info = null;<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      if (!regionInfo.getTable().isSystemTable()) {<a name="line.326"></a>
+<span class="sourceLineNo">327</span>        info = regionInfo;<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        admin.unassign(regionInfo.getRegionName(), true);<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>    boolean isInList = ProtobufUtil.getOnlineRegions(<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      rs.getRSRpcServices()).contains(info);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>    long timeout = System.currentTimeMillis() + 10000;<a name="line.333"></a>
+<span class="sourceLineNo">334</span>    while ((System.currentTimeMillis() &lt; timeout) &amp;&amp; (isInList)) {<a name="line.334"></a>
+<span class="sourceLineNo">335</span>      Thread.sleep(100);<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      isInList = ProtobufUtil.getOnlineRegions(<a name="line.336"></a>
+<span class="sourceLineNo">337</span>        rs.getRSRpcServices()).contains(info);<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>    assertFalse("The region should not be present in online regions list.",<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      isInList);<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>  @Test<a name="line.344"></a>
+<span class="sourceLineNo">345</span>  public void testCloseRegionIfInvalidRegionNameIsPassed() throws Exception {<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    final String name = this.name.getMethodName();<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    byte[] tableName = Bytes.toBytes(name);<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    createTableWithDefaultConf(tableName);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    RegionInfo info = null;<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(TableName.valueOf(tableName));<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      if (!regionInfo.isMetaRegion()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>        if (regionInfo.getRegionNameAsString().contains(name)) {<a name="line.355"></a>
+<span class="sourceLineNo">356</span>          info = regionInfo;<a name="line.356"></a>
+<span class="sourceLineNo">357</span>          try {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>            admin.unassign(Bytes.toBytes("sample"), true);<a name="line.358"></a>
+<span class="sourceLineNo">359</span>          } catch (UnknownRegionException nsre) {<a name="line.359"></a>
+<span class="sourceLineNo">360</span>            // expected, ignore it<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>    onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.365"></a>
+<span class="sourceLineNo">366</span>    assertTrue("The region should be present in online regions list.",<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        onlineRegions.contains(info));<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>  @Test<a name="line.370"></a>
+<span class="sourceLineNo">371</span>  public void testCloseRegionThatFetchesTheHRIFromMeta() throws Exception {<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    createTableWithDefaultConf(tableName);<a name="line.373"></a>
+<span class="sourceLineNo">374</span><a name="line.374"></a>
+<span class="sourceLineNo">375</span>    RegionInfo info = null;<a name="line.375"></a>
+<span class="sourceLineNo">376</span>    HRegionServer rs = TEST_UTIL.getRSForFirstRegionInTable(tableName);<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    List&lt;RegionInfo&gt; onlineRegions = ProtobufUtil.getOnlineRegions(rs.getRSRpcServices());<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    for (RegionInfo regionInfo : onlineRegions) {<a name="line.378"></a>
+<span class="sourceLineNo">379</span>      if (!regionInfo.isMetaRegion()) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        if (regionInfo.getRegionNameAsString().contains("TestHBACloseRegion2")) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>          info = regionInfo;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>          admin.unassign(regionInfo.getRegionName(), true);<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><a name="line.386"></a>
+<span class="sourceLineNo">387</span>    boolean isInList = ProtobufUtil.getOnlineRegions(<a name="line.387"></a>
+<span class="sourceLineNo">388</span>      rs.getRSRpcServices()).contains(info);<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    long timeout = System.currentTimeMillis() + 10000;<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    while ((System.currentTimeMillis() &lt; timeout) &amp;&amp; (isInList)) {<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      Thread.sleep(100);<a name="line.391"></a>
+<span class="sourceLineNo">392</span>      isInList = ProtobufUtil.getOnlineRegions(<a name="line.392"></a>
+<span class="sourceLineNo">393</span>        rs.getRSRpcServices()).contains(info);<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>    assertFalse("The region should not be present in online regions list.",<a name="line.396"></a>
+<span class="sourceLineNo">397</span>      isInList);<a name="line.397"></a>
+<span class="sourceLineNo">398</span>  }<a name="line.398"></a>
 <span class="sourceLineNo">399</span><a name="line.399"></a>
-<span class="sourceLineNo">400</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.401"></a>
+<span class="sourceLineNo">400</span>  private HBaseAdmin createTable(TableName tableName) throws IOException {<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    HBaseAdmin admin = TEST_UTIL.getHBaseAdmin();<a name="line.401"></a>
 <span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>    htd.addFamily(hcd);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    admin.createTable(htd, null);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    return admin;<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>  private void createTableWithDefaultConf(byte[] TABLENAME) throws IOException {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    createTableWithDefaultConf(TableName.valueOf(TABLENAME));<a name="line.409"></a>
-<span class="sourceLineNo">410</span>  }<a name="line.410"></a>
-<span class="sourceLineNo">411</span><a name="line.411"></a>
-<span class="sourceLineNo">412</span>  private void createTableWithDefaultConf(TableName TABLENAME) throws IOException {<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    HTableDescriptor htd = new HTableDescriptor(TABLENAME);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    htd.addFamily(hcd);<a name="line.415"></a>
-<span class="sourceLineNo">416</span><a name="line.416"></a>
-<span class="sourceLineNo">417</span>    admin.createTable(htd, null);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>  }<a name="line.418"></a>
+<span class="sourceLineNo">403</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.404"></a>
+<span class="sourceLineNo">405</span><a name="line.405"></a>
+<span class="sourceLineNo">406</span>    htd.addFamily(hcd);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    admin.createTable(htd, null);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    return admin;<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  }<a name="line.409"></a>
+<span class="sourceLineNo">410</span><a name="line.410"></a>
+<span class="sourceLineNo">411</span>  private void createTableWithDefaultConf(byte[] TABLENAME) throws IOException {<a name="line.411"></a>
+<span class="sourceLineNo">412</span>    createTableWithDefaultConf(TableName.valueOf(TABLENAME));<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>  private void createTableWithDefaultConf(TableName TABLENAME) throws IOException {<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    HTableDescriptor htd = new HTableDescriptor(TABLENAME);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    HColumnDescriptor hcd = new HColumnDescriptor("value");<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    htd.addFamily(hcd);<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>   * For HBASE-2556<a name="line.421"></a>
-<span class="sourceLineNo">422</span>   * @throws IOException<a name="line.422"></a>
-<span class="sourceLineNo">423</span>   */<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  @Test<a name="line.424"></a>
-<span class="sourceLineNo">425</span>  public void testGetTableRegions() throws IOException {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.426"></a>
-<span class="sourceLineNo">427</span><a name="line.427"></a>
-<span class="sourceLineNo">428</span>    int expectedRegions = 10;<a name="line.428"></a>
-<span class="sourceLineNo">429</span><a name="line.429"></a>
-<span class="sourceLineNo">430</span>    // Use 80 bit numbers to make sure we aren't limited<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    byte [] startKey = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    byte [] endKey =   { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };<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>    HTableDescriptor desc = new HTableDescriptor(tableName);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    admin.createTable(desc, startKey, endKey, expectedRegions);<a name="line.437"></a>
-<span class="sourceLineNo">438</span><a name="line.438"></a>
-<span class="sourceLineNo">439</span>    List&lt;RegionInfo&gt; RegionInfos = admin.getRegions(tableName);<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>    assertEquals("Tried to create " + expectedRegions + " regions " +<a name="line.441"></a>
-<span class="sourceLineNo">442</span>        "but only found " + RegionInfos.size(),<a name="line.442"></a>
-<span class="sourceLineNo">443</span>        expectedRegions, RegionInfos.size());<a name="line.443"></a>
-<span class="sourceLineNo">444</span> }<a name="line.444"></a>
-<span class="sourceLineNo">445</span><a name="line.445"></a>
-<span class="sourceLineNo">446</span>  @Test<a name="line.446"></a>
-<span class="sourceLineNo">447</span>  public void testMoveToPreviouslyAssignedRS() throws IOException, InterruptedException {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    HMaster master = cluster.getMaster();<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.450"></a>
-<span class="sourceLineNo">451</span>    Admin localAdmin = createTable(tableName);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>    List&lt;RegionInfo&gt; tableRegions = localAdmin.getRegions(tableName);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>    RegionInfo hri = tableRegions.get(0);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>    AssignmentManager am = master.getAssignmentManager();<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    ServerName server = am.getRegionStates().getRegionServerOfRegion(hri);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>    localAdmin.move(hri.getEncodedNameAsBytes(), Bytes.toBytes(server.getServerName()));<a name="line.456"></a>
-<span class="sourceLineNo">457</span>    assertEquals("Current region server and region server before move should be same.", server,<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      am.getRegionStates().getRegionServerOfRegion(hri));<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>  @Test<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public void testWALRollWriting() throws Exception {<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    setUpforLogRolling();<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    String className = this.getClass().getName();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    StringBuilder v = new StringBuilder(className);<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    while (v.length() &lt; 1000) {<a name="line.466"></a>
-<span class="sourceLineNo">467</span>      v.append(className);<a name="line.467"></a>
-<span class="sourceLineNo">468</span>    }<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    byte[] value = Bytes.toBytes(v.toString());<a name="line.469"></a>
-<span class="sourceLineNo">470</span>    HRegionServer regionServer = startAndWriteData(TableName.valueOf(name.getMethodName()), value);<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    LOG.info("after writing there are "<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        + AbstractFSWALProvider.getNumRolledLogFiles(regionServer.getWAL(null)) + " log files");<a name="line.472"></a>
-<span class="sourceLineNo">473</span><a name="line.473"></a>
-<span class="sourceLineNo">474</span>    // flush all regions<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    for (HRegion r : regionServer.getOnlineRegionsLocalContext()) {<a name="line.475"></a>
-<span class="sourceLineNo">476</span>      r.flush(true);<a name="line.476"></a>
-<span class="sourceLineNo">477</span>    }<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    admin.rollWALWriter(regionServer.getServerName());<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    int count = AbstractFSWALProvider.getNumRolledLogFiles(regionServer.getWAL(null));<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    LOG.info("after flushing all regions and rolling logs there are " +<a name="line.480"></a>
-<span class="sourceLineNo">481</span>        count + " log files");<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    assertTrue(("actual count: " + count), count &lt;= 2);<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>  private void setUpforLogRolling() {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    // Force a region split after every 768KB<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    TEST_UTIL.getConfiguration().setLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.487"></a>
-<span class="sourceLineNo">488</span>        768L * 1024L);<a name="line.488"></a>
-<span class="sourceLineNo">489</span><a name="line.489"></a>
-<span class="sourceLineNo">490</span>    // We roll the log after every 32 writes<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    TEST_UTIL.getConfiguration().setInt("hbase.regionserver.maxlogentries", 32);<a name="line.491"></a>
+<span class="sourceLineNo">420</span>    admin.createTable(htd, null);<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>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * For HBASE-2556<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   * @throws IOException<a name="line.425"></a>
+<span class="sourceLineNo">426</span>   */<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  @Test<a name="line.427"></a>
+<span class="sourceLineNo">428</span>  public void testGetTableRegions() throws IOException {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.429"></a>
+<span class="sourceLineNo">430</span><a name="line.430"></a>
+<span class="sourceLineNo">431</span>    int expectedRegions = 10;<a name="line.431"></a>
+<span class="sourceLineNo">432</span><a name="line.432"></a>
+<span class="sourceLineNo">433</span>    // Use 80 bit numbers to make sure we aren't limited<a name="line.433"></a>
+<span class="sourceLineNo">434</span>    byte [] startKey = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    byte [] endKey =   { 9, 9, 9, 9, 9, 9, 9, 9, 9, 9 };<a name="line.435"></a>
+<span class="sourceLineNo">436</span><a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    HTableDescriptor desc = new HTableDescriptor(tableName);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    desc.addFamily(new HColumnDescriptor(HConstants.CATALOG_FAMILY));<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    admin.createTable(desc, startKey, endKey, expectedRegions);<a name="line.440"></a>
+<span class="sourceLineNo">441</span><a name="line.441"></a>
+<span class="sourceLineNo">442</span>    List&lt;RegionInfo&gt; RegionInfos = admin.getRegions(tableName);<a name="line.442"></a>
+<span class="sourceLineNo">443</span><a name="line.443"></a>
+<span class="sourceLineNo">444</span>    assertEquals("Tried to create " + expectedRegions + " regions " +<a name="line.444"></a>
+<span class="sourceLineNo">445</span>        "but only found " + RegionInfos.size(),<a name="line.445"></a>
+<span class="sourceLineNo">446</span>        expectedRegions, RegionInfos.size());<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>  @Test<a name="line.449"></a>
+<span class="sourceLineNo">450</span>  public void testMoveToPreviouslyAssignedRS() throws IOException, InterruptedException {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>    MiniHBaseCluster cluster = TEST_UTIL.getHBaseCluster();<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    HMaster master = cluster.getMaster();<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    Admin localAdmin = createTable(tableName);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    List&lt;RegionInfo&gt; tableRegions = localAdmin.getRegions(tableName);<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    RegionInfo hri = tableRegions.get(0);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>    AssignmentManager am = master.getAssignmentManager();<a name="line.457"></a>
+<span class="sourceLineNo">458</span>    ServerName server = am.getRegionStates().getRegionServerOfRegion(hri);<a name="line.458"></a>
+<span class="sourceLineNo">459</span>    localAdmin.move(hri.getEncodedNameAsBytes(), Bytes.toBytes(server.getServerName()));<a name="line.459"></a>
+<span class="sourceLineNo">460</span>    assertEquals("Current region server and region server before move should be same.", server,<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      am.getRegionStates().getRegionServerOfRegion(hri));<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>  @Test<a name="line.464"></a>
+<span class="sourceLineNo">465</span>  public void testWALRollWriting() throws Exception {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    setUpforLogRolling();<a name="line.466"></a>
+<span class="sourceLineNo">467</span>    String className = this.getClass().getName();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    StringBuilder v = new StringBuilder(className);<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    while (v.length() &lt; 1000) {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>      v.append(className);<a name="line.470"></a>
+<span class="sourceLineNo">471</span>    }<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    byte[] value = Bytes.toBytes(v.toString());<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    HRegionServer regionServer = startAndWriteData(TableName.valueOf(name.getMethodName()), value);<a name="line.473"></a>
+<span class="sourceLineNo">474</span>    LOG.info("after writing there are "<a name="line.474"></a>
+<span class="sourceLineNo">475</span>        + AbstractFSWALProvider.getNumRolledLogFiles(regionServer.getWAL(null)) + " log files");<a name="line.475"></a>
+<span class="sourceLineNo">476</span><a name="line.476"></a>
+<span class="sourceLineNo">477</span>    // flush all regions<a name="line.477"></a>
+<span class="sourceLineNo">478</span>    for (HRegion r : regionServer.getOnlineRegionsLocalContext()) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      r.flush(true);<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    admin.rollWALWriter(regionServer.getServerName());<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    int count = AbstractFSWALProvider.getNumRolledLogFiles(regionServer.getWAL(null));<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("after flushing all regions and rolling logs there are " +<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        count + " log files");<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    assertTrue(("actual count: " + count), count &lt;= 2);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  }<a name="line.486"></a>
+<span class="sourceLineNo">487</span><a name="line.487"></a>
+<span class="sourceLineNo">488</span>  private void setUpforLogRolling() {<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    // Force a region split after every 768KB<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    TEST_UTIL.getConfiguration().setLong(HConstants.HREGION_MAX_FILESIZE,<a name="line.490"></a>
+<span class="sourceLineNo">491</span>        768L * 1024L);<a name="line.491"></a>
 <span class="sourceLineNo">492</span><a name="line.492"></a>
-<span class="sourceLineNo">493</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.493"></a>
-<span class="sourceLineNo">494</span>        "hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    TEST_UTIL.getConfiguration().setInt("hbase.rpc.timeout", 10 * 1000);<a name="line.495"></a>
-<span class="sourceLineNo">496</span><a name="line.496"></a>
-<span class="sourceLineNo">497</span>    // For less frequently updated regions flush after every 2 flushes<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        "hbase.hregion.memstore.optionalflushcount", 2);<a name="line.499"></a>
-<span class="sourceLineNo">500</span><a name="line.500"></a>
-<span class="sourceLineNo">501</span>    // We flush the cache after every 8192 bytes<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    TEST_UTIL.getConfiguration().setInt(HConstants.HREGION_MEMSTORE_FLUSH_SIZE,<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        8192);<a name="line.503"></a>
-<span class="sourceLineNo">504</span><a name="line.504"></a>
-<span class="sourceLineNo">505</span>    // Increase the amount of time between client retries<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    TEST_UTIL.getConfiguration().setLong("hbase.client.pause", 10 * 1000);<a name="line.506"></a>
+<span class="sourceLineNo">493</span>    // We roll the log after every 32 writes<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    TEST_UTIL.getConfiguration().setInt("hbase.regionserver.maxlogentries", 32);<a name="line.494"></a>
+<span class="sourceLineNo">495</span><a name="line.495"></a>
+<span class="sourceLineNo">496</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.496"></a>
+<span class="sourceLineNo">497</span>        "hbase.regionserver.logroll.errors.tolerated", 2);<a name="line.497"></a>
+<span class="sourceLineNo">498</span>    TEST_UTIL.getConfiguration().setInt("hbase.rpc.timeout", 10 * 1000);<a name="line.498"></a>
+<span class="sourceLineNo">499</span><a name="line.499"></a>
+<span class="sourceLineNo">500</span>    // For less frequently updated regions flush after every 2 flushes<a name="line.500"></a>
+<span class="sourceLineNo">501</span>    TEST_UTIL.getConfiguration().setInt(<a name="line.501"></

<TRUNCATED>